2011-11-11 177 views
12

我的Android應用程序出現問題。我需要一個應用程序,每10分鐘發送一次背景GPS位置到服務器(在這裏我有WCF服務工作)。即使應用程序已關閉,應用程序也需要發送數據。所以我創建了一個服務(用於測試目的),它在服務器上發送給我時間。但是當我在我的服務中插入用於獲取GPS位置的代碼時,一切都失敗(意外停止)。後臺服務需要在服務器上發送GPS位置

我有蘆葦,你需要把一些接收器或一些東西,但目前爲止沒有任何作品。所以如果有人能幫助我,我會很高興。

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.biromatik.GPS" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="4" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:label="@string/app_name" 
      android:name=".ETMGPSServiceActivity" > 
      <intent-filter > 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
    <application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:name=".MyApplication" > 
    <service 
     android:enabled="true" 
     android:name=".MonitorService" > 
    </service> 
    <receiver 
     android:enabled="true" 
     android:name=".LocationReceiver" > 
     <intent-filter > 
      <action android:name="com.biromatik.intent.action.LOCATION" /> 
     </intent-filter> 
    </receiver> 
</application> 


    <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 




</manifest> 
+0

「我的服務一切都失敗(意外停止)」 - >你得到的錯誤是什麼? – Hoff

+0

在CatLog我得到這個:11-11 15:25:49.541:E/AndroidRuntime(229):未捕獲的處理程序:線程主要由於未捕獲的異常退出 –

回答

33

我已經在我的應用程序中做了這件事來做同樣的事情,你問。

在我的服務,我添加了這個:

@Override 
public void onStart(Intent intent, int startId) { 

    super.onStart(intent, startId); 
    addLocationListener(); 
} 

private void addLocationListener() 
{ 
    triggerService = new Thread(new Runnable(){ 
     public void run(){ 
      try{ 
       Looper.prepare();//Initialise the current thread as a looper. 
       lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 

       Criteria c = new Criteria(); 
       c.setAccuracy(Criteria.ACCURACY_COARSE); 

       final String PROVIDER = lm.getBestProvider(c, true); 

       MyLocationListener myLocationListener = new MyLocationListener(); 
       lm.requestLocationUpdates(PROVIDER, 600000, 0, myLocationListener); 
       Log.d("LOC_SERVICE", "Service RUNNING!"); 
       Looper.loop(); 
      }catch(Exception ex){ 
       ex.printStackTrace(); 
      } 
     } 
    }, "LocationThread"); 
    triggerService.start(); 
} 

public static void updateLocation(Location location) 
{ 
    Context appCtx = MyApplication.getAppContext(); 

    double latitude, longitude; 

    latitude = location.getLatitude(); 
    longitude = location.getLongitude(); 

    Intent filterRes = new Intent(); 
    filterRes.setAction("xxx.yyy.intent.action.LOCATION"); 
    filterRes.putExtra("latitude", latitude); 
    filterRes.putExtra("longitude", longitude); 
    appCtx.sendBroadcast(filterRes); 
} 


class MyLocationListener implements LocationListener 
{ 

    @Override 
    public void onLocationChanged(Location location) 
    { 
     updateLocation(location); 
    } 
} 

注:見我使用MyApplication.getAppContext();這是因爲我正在使用我自己的Application類來添加上下文。 然後,我有這個一個BroadcastReceiver:

public class LocationReceiver extends BroadcastReceiver { 

    double latitude, longitude; 

    @Override 
    public void onReceive(final Context context, final Intent calledIntent) 
    { 
     Log.d("LOC_RECEIVER", "Location RECEIVED!"); 

     latitude = calledIntent.getDoubleExtra("latitude", -1); 
     longitude = calledIntent.getDoubleExtra("longitude", -1); 

     updateRemote(latitude, longitude); 

    } 

    private void updateRemote(final double latitude, final double longitude) 
    { 
     //HERE YOU CAN PUT YOUR ASYNCTASK TO UPDATE THE LOCATION ON YOUR SERVER 
    } 
} 

應用程序類:

public class MyApplication extends Application { 


    private static Context context; 

    /* (non-Javadoc) 
    * @see android.app.Application#onCreate() 
    */ 
    @Override 
    public void onCreate() {    
     MyApplication.context=getApplicationContext(); 
    } 

    public static Context getAppContext() { 
     return MyApplication.context; 
    } 
} 

而且在你的清單,你需要添加兩個:

<application 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" 
    android:name=".MyApplication" > 

    //YOUR ACTIVITIES HERE... 

    <service 
     android:enabled="true" 
     android:name=".LocationService" > 
    </service> 

    <receiver 
     android:enabled="true" 
     android:name=".LocationReceiver" > 
     <intent-filter > 
      <action android:name="xxx.yyy.intent.action.LOCATION" /> 
     </intent-filter> 
    </receiver> 
</application> 

方法來檢測,如果該服務正在運行我在我的第一個活動上執行此操作:

/** 
* Check location service. 
*/ 
private void checkLocationService() 
{ 
    Log.d("CHECK_SERVICE", "Service running: " + (settings.getBoolean("locationService", false)?"YES":"NO")); 

    if(settings.getBoolean("locationService", false)) 
     return; 

    Intent mServiceIntent = new Intent(this, LocationService.class); 
    startService(mServiceIntent); 
} 

顯然,你需要控制SharedPreferences(設置)如果該服務正在運行(在onStart)否(的onDestroy)的locationService變量設置爲真/假

+0

看起來很完美,但我仍然有問題:這xxx.yyy.intent。 ..什麼把,而我也有問題,MyApplication.getCOntext(),有沒有其他方式? –

+0

正如我所說的你需要創建一個從應用程序擴展的類(並將其添加到你的清單)xxx.yyy.intent.action.LOCATION可以是你想要的任何東西..就像你的包的名稱並添加intent.action .LOCATION更具體一些。我將編輯我的答案與應用程序類 – SERPRO

+0

好吧,現在我得到:W/ActivityManager(51):無法啓動服務Intent {act = com.biromatik.GPS.MonitorService}:未找到。你能告訴我如何開始這項服務嗎? –