广播接收器中的定时器功能用于识别Android应用中的gps?

时间:2012-01-09 11:07:09

标签: android timer gps broadcastreceiver

Hai我试图在广播接收器应用程序中添加定时器功能以接收gps中的纬度和长度。但是我得到了Error.Anybody请请纠正我的错误。

提前致谢

我更新错误部分

public class MainActivity extends Activity implements LocationListener {
final DBAdapter1 db=new DBAdapter1(this);
    private ConnectivityReceiver receiver = null;
    private TextView txtNetworkInfo ;
    private static TextView latituteField;
    private static TextView longitudeField;
    private LocationManager locationManager;
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
      private static final String HostUrl =" xxxxx";
     // private static final String HostUrl ="  yyyy";
      private static final String NAMESPACE = "http://tempuri.org/";
      private HttpTransportSE httpTransport = new HttpTransportSE(HostUrl);
    private String provider;
    private SoapObject request=null;
    private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; // in Meters
    private static final long MINIMUM_TIME_BETWEEN_UPDATES = 1800000; // in Milliseconds

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    latituteField = (TextView) findViewById(R.id.TextView02);
    longitudeField = (TextView) findViewById(R.id.TextView04);
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    // Define the criteria how to select the locatioin provider -> use
    // default
    Criteria criteria = new Criteria();
    Log.i("ConnTest",locationManager.toString());
provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);

// Initialize the location fields
if (location != null) {
    System.out.println("Provider " + provider + " has been selected.");
    float lat = (float) (location.getLatitude());
    float lng = (float) (location.getLongitude());
    latituteField.setText(String.valueOf(lat));
    longitudeField.setText(String.valueOf(lng));

} else {
    latituteField.setText("provider not available");
    longitudeField.setText("provider not available");
}

    txtNetworkInfo = (TextView)findViewById(R.id.txtNetworkInfo);

    receiver = new ConnectivityReceiver();

            registerReceiver(receiver,new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));


}
@Override
protected void onResume() {
    super.onResume();
    //locationManager.requestLocationUpdates(provider,1000, 1, this);
    locationManager.requestLocationUpdates(
            provider, 
            MINIMUM_TIME_BETWEEN_UPDATES, 
            MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,
            this
    );
}

/* Remove the locationlistener updates when Activity is paused */
@Override
protected void onPause() {
    super.onPause();
    locationManager.removeUpdates(this);
}

@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub
    float lat = (float) (location.getLatitude());
    float lng = (float) (location.getLongitude());
    longitudeField.setText(String.valueOf(lng));
    latituteField.setText(String.valueOf(lat));
     try {
            db.open();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         long id=db.insert(latituteField.getText().toString(),longitudeField.getText().toString());
            if(id>1)
                {
                Toast.makeText(getBaseContext(),"one record is inserted",Toast.LENGTH_LONG).show();
                }
            else
            {
                Toast.makeText(getBaseContext(),"not inserted",Toast.LENGTH_LONG).show();

            }

}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub
    Toast.makeText(this, "Enabled new provider " + provider,
            Toast.LENGTH_SHORT).show();

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub
    Toast.makeText(this, "Disenabled provider " + provider,
            Toast.LENGTH_SHORT).show();

}
protected void Display(Cursor c) {
    Toast.makeText(this, "rowid: " + c.getString(0) + "\n" +
     "Latitude: " + c.getString(1) + "\n" + "Longitude: " + c.getString(2) + "\n" +
     Toast.LENGTH_LONG, 0).show();    
}

@Override
    protected void onDestroy() {
            unregisterReceiver(receiver);

            super.onDestroy();
    }

private String getNetworkStateString(NetworkInfo.State state){
    String stateString = "Unknown";

    switch(state)
    {
            case CONNECTED:         stateString = "Connected";              break;
            case CONNECTING:        stateString = "Connecting";     break;
            case DISCONNECTED:      stateString = "Disconnected";   break;
            case DISCONNECTING:     stateString = "Disconnecting";  break;
            case SUSPENDED:         stateString = "Suspended";              break;
            default:                        stateString = "Unknown";                break;
    }

    return stateString;
}

    private class ConnectivityReceiver extends BroadcastReceiver{

            private Timer mTimer;
            private TimerTask mTimerTask;

            @Override
            public void onReceive(Context context, Intent intent) {
                    NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);

                    if(null != info)
                    {
                            String state = getNetworkStateString(info.getState());
                            if(state.equals("Connected")){
                                mTimer = new Timer();
                                mTimer.scheduleAtFixedRate(mTimerTask,1000,5000);
                                mTimerTask = new TimerTask() {

                                    @Override
                                    public void run() {
                                          result();
                                                                                         }
                                };
                            }
                            else{
                                //result();
                            }

                            }
            }   
                    }

    private void result() {
        SoapPrimitive response=null;
         final String methodname="InsertAllGPSInformation";
            request = new SoapObject(NAMESPACE,methodname);
            envelope.dotNet = true;
            request.addProperty("Longitude",longitudeField.getText().toString()); 
            request.addProperty("Latitude",latituteField.getText().toString()); 
            request.addProperty("Date",newtime);

            envelope.setOutputSoapObject(request);
             String result = null;
            try
             {          
                httpTransport.call(NAMESPACE+"IService/"+methodname, envelope);
                response = ( SoapPrimitive )envelope.getResponse();
                result=response.toString();
             }
            catch(Exception e)
             {
                Toast.makeText(getBaseContext(), "Your Net Connected or Not Login to Net"+"", Toast.LENGTH_LONG).show();
                Log.e("Upload Picture Error:",e.getMessage());
             }
            if(result.equals("Saved Successfully")){
            Toast.makeText(getBaseContext(), ""+result, Toast.LENGTH_LONG).show();
            }
    }

    }

更新

    01-09 17:13:27.168: ERROR/AndroidRuntime(1983): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    01-09 17:13:27.168: ERROR/AndroidRuntime(1983):     at android.os.Handler.<init>(Handler.java:121)
   01-09 17:13:27.168: ERROR/AndroidRuntime(1983):     at android.widget.Toast.<init>(Toast.java:68)
   01-09 17:13:27.168: ERROR/AndroidRuntime(1983):     at android.widget.Toast.makeText(Toast.java:231)
   01-09 17:13:27.168: ERROR/AndroidRuntime(1983):     at com.varma.samples.conntest.MainActivity.result(MainActivity.java:240)
   01-09 17:13:27.168: ERROR/AndroidRuntime(1983):     at com.varma.samples.conntest.MainActivity.access$1(MainActivity.java:212)
  01-09 17:13:27.168: ERROR/AndroidRuntime(1983):     at com.varma.samples.conntest.MainActivity$ConnectivityReceiver$1.run(MainActivity.java:199)
  01-09 17:13:27.168: ERROR/AndroidRuntime(1983):     at java.util.Timer$TimerImpl.run(Timer.java:289)

1 个答案:

答案 0 :(得分:0)

当您在mTimerTask课程的mTimer.scheduleAtFixedRate(mTimerTask,1000,5000);中致电onRecieve时,

ConnectivityReceiver为空。

您需要将该行放在AFTER

之后
mTimerTask = new TimerTask() {
    @Override
    public void run() {
        result();
    }
};

所以你的代码看起来像这样:

mTimerTask = new TimerTask() {
    @Override
    public void run() {
        result();
   }
};
mTimer.scheduleAtFixedRate(mTimerTask,1000,5000);

要自己解决这个问题,如果你看一下你会看到的错误信息(大约一半):

Caused by: java.lang.NullPointerException

所以现在你知道是什么导致了你的错误。现在从那里向下看,直到你到达一个班级&amp;您创建的方法。在这种情况下:

at com.varma.samples.conntest.MainActivity$ConnectivityReceiver.onReceive(MainActivity.java:196)

您所在的班级文件com.varma.samples.conntest.MainActivity您所在的班级是ConnectivityReveiver,而您所在的班级是onReceive。如果在括号中没有帮助,则是您的NullPointer源自的java文件和行号。

如果在抛出NullPointerException之前通过不同的方法传递变量,有时可能需要追溯几行。