前もって感謝します 、
サービスでユーザーの現在の位置を取得しようとしていますが、(日食で) DDMS を介して経度と緯度を送信しているときに、突然アプリケーションが強制的にサービスのコードを閉じられます。
コード:
package com.android.trace;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.widget.Toast;
public class MyService extends Service{
String tag="TestService";
double logi;
double lat;
long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; // in Meters
long MINIMUM_TIME_BETWEEN_UPDATES = 1000; // in Millisecon
Location loc;
LocationManager manager;
@Override
public void onCreate() {
manager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
manager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MINIMUM_TIME_BETWEEN_UPDATES,
MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,
new MyLocationListener()
);
Toast.makeText(MyService.this,"activity created...",Toast.LENGTH_LONG).show();
loc=manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
String s;
if(loc!=null)
{
logi=loc.getLongitude();
lat=loc.getLatitude();
s="Lat:" + lat + "\nLong:" + logi;
}
else
{
s ="no location found";
}
Toast.makeText(this,"Your Current Position is:\n" +
s,Toast.LENGTH_LONG).show();
webcall(logi,lat);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(MyService.this, "Service destroyed...", Toast.LENGTH_LONG).show();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
public void webcall(double logi,double lat)
{
InputStream is=null;
String result = "";
//the year data to send
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("logitude",Double.toString(logi)));
nameValuePairs.add(new BasicNameValuePair("latitude",Double.toString(lat)));
//http post
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://10.0.2.2/location.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}catch(Exception e){
Toast.makeText(MyService.this,"Error in http connection "+e.toString(),Toast.LENGTH_LONG).show();
}
//convert response to string
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result=sb.toString();
Toast.makeText(MyService.this,result,Toast.LENGTH_LONG).show();
}catch(Exception e){
Toast.makeText(MyService.this,"Error converting result "+e.toString(),Toast.LENGTH_LONG).show();
}
}
}
class MyLocationListener implements LocationListener
{
public void onLocationChanged(Location location) {
new MyService().webcall(location.getLongitude(),location.getLatitude());
}
public void onProviderDisabled(String s) {
}
public void onProviderEnabled(String s) {
}
public void onStatusChanged(String s, int i, Bundle b) {
}
}
私は放送受信機を使用して、開始時にサービスを開始しています。放送受信機のコードは次のとおりです。
コード:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Intent startServiceIntent = new Intent(context, MyService.class);
startServiceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startService(startServiceIntent);
}
}
そしてマニフェストは
<service android:enabled="true" android:name=".MyService">
<intent-filter>
<action android:name="com.android.trace.MyService"/>
</intent-filter>
</service>
<receiver android:name="com.android.trace.MyBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
そしてlogcatは
09-06 13:14:38.427: E/AndroidRuntime(255): FATAL EXCEPTION: main
09-06 13:14:38.427: E/AndroidRuntime(255): java.lang.NullPointerException
09-06 13:14:38.427: E/AndroidRuntime(255): at android.content.ContextWrapper.getResources(ContextWrapper.java:80)
09-06 13:14:38.427: E/AndroidRuntime(255):at android.widget.Toast.<init>Toast.java:89)
09-06 13:14:38.427:E/AndroidRuntime(255):aandroid.widget.Toast.makeText(Toast.java:231)
09-06 13:14:38.427:E/AndroidRuntime(255):atcom.android.trace.MyService.webcall(MyService.java:128)
09-06 13:14:38.427:E/AndroidRuntime(255):atcom.android.trace.MyLocationListener.onLocationChanged(MyService.java:141)
09-06 13:14:38.427: E/AndroidRuntime(255): at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:191)
09-06 13:14:38.427: E/AndroidRuntime(255): at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:124)
09-06 13:14:38.427: E/AndroidRuntime(255): at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:140)
09-06 13:14:38.427: E/AndroidRuntime(255): at android.os.Handler.dispatchMessage(Handler.java:99)
09-06 13:14:38.427: E/AndroidRuntime(255): at android.os.Looper.loop(Looper.java:123)
09-06 13:14:38.427: E/AndroidRuntime(255): at android.app.ActivityThread.main(ActivityThread.java:4627)
09-06 13:14:38.427: E/AndroidRuntime(255): at java.lang.reflect.Method.invokeNative(Native Method)
09-06 13:14:38.427: E/AndroidRuntime(255): at java.lang.reflect.Method.invoke(Method.java:521)
09-06 13:14:38.427: E/AndroidRuntime(255): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-06 13:14:38.427: E/AndroidRuntime(255): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-06 13:14:38.427: E/AndroidRuntime(255): at dalvik.system.NativeStart.main(Native Method)
場所が変更されたときにnullポインター例外が発生するのを助けてください、私はAndroidが初めてです。前もって感謝します。