2011-11-11 14 views
12

Android uygulamamla ilgili bir sorunum var. Sunucuya her 10 dakikada bir GPS konum bilgisi gönderecek bir uygulamaya ihtiyacım var (burada çalışan WCF servisim var). Uygulamanın kapalı olsa bile veri göndermesi gerekir. Bu yüzden, sunucuda bana zaman gönderen bir hizmet (test amaçlı) oluşturdum. Ancak servisimde GPS konumumu almak için kodumu eklediğimde her şey başarısız oluyor (beklenmedik bir şekilde durdu).Arka plan hizmetinin GPS konumunun sunucuya gönderilmesi gerekiyor

Bazı alıcılar veya bir şeyler koymanız gerektiğini düşündüm ama hiçbir şey şu ana kadar işe yaramaz. Birisi bana yardım ederse çok memnun olurum.

<?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

"Hizmetim her şey başarısız (beklenmedik bir şekilde durdu)" -> Ne aldığınız hata nedir? – Hoff

+0

CatLog'da şunu elde edeceğim: 11-11 15: 25: 49.541: E/Android Çalışması (229): Yakalanmamış işleyici: işlenmemiş istisna nedeniyle iş parçacığı ana çıkışı –

cevap

33

Bunu, uyguladığınız soruyu yapmak için uygulamamda yaptım.

@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); 
    } 
} 

NOT: Benim hizmetinde

bu katma I) (MyApplication.getAppContext kullandığını görün; çünkü içeriği eklemek için kendi Uygulama sınıfımı kullanıyorum. Ve sonra bunu bir BroadcastReceiver vardır:

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 
    } 
} 

Uygulama sınıfı: Manifest'inizde Ayrıca

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; 
    } 
} 

hem eklemeniz gerekir: eğer algılamak için

<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> 

Yöntemi Hizmet çalışıyor Benim ilk etkinliğimde bunu yapıyorum:

/** 
* 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); 
} 

Açıkçası servisi (ONSTART) olmadığını (OnDestroy) çalışıyorsa doğru/yanlış için LocationService değişkeni ayarlamak için SharedPreferences (ayarları) kontrol etmemiz gerekir.

+0

Mükemmel görünüyor ama yine de sorunlarım var: Bu xxx.yyy.intent. .. yerine koymak ve aynı zamanda MyApplication.getCOntext() ile başka bir sorun var mı? –

+0

dediğim gibi Uygulamadan uzayan bir sınıf oluşturmanız (ve manifestinize ekleyiniz) xxx.yyy.intent.action.LOCATION istediğiniz her şey olabilir .. paketinizin adı gibi. .LOCATION bu konuda daha spesifik olacak .. Cevabımı uygulama sınıfı – SERPRO

+0

ile düzelteceğim Şimdi alacağım: W/ActivityManager (51): Hizmet başlatılamıyor. Intent {act = com.biromatik.GPS.MonitorService}: bulunamadı. Bana bu servise nasıl başlayacağımı söyleyebilir misin? –