-1

前もって感謝します 、

サービスでユーザーの現在の位置を取得しようとしていますが、(日食で) 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が初めてです。前もって感謝します。

4

1 に答える 1

1

サービスを自分でインスタンス化することはできません。これは、コンテキストを初期化するためにフレームワークによってインスタンス化する必要があります。MyLocationListenerをサービス内に移動し、

それ以外の

new MyService().webcall 

使用する

   MyService.this.webcall(location.getLongitude(),location.getLatitude());

あるいは単に

webcall(location.getLongitude(),location.getLatitude());
于 2012-09-06T13:45:11.767 に答える