2011-11-11 24 views
12

Tôi gặp sự cố với ứng dụng Android của mình. Tôi cần một ứng dụng sẽ gửi ở vị trí GPS nền sau mỗi 10 phút đến máy chủ (ở đây tôi có dịch vụ WCF hoạt động). Ứng dụng cần gửi dữ liệu ngay cả khi nó bị đóng. Vì vậy, tôi tạo ra một dịch vụ (cho mục đích thử nghiệm) mà gửi cho tôi thời gian trên máy chủ. Nhưng khi tôi chèn mã của tôi để có được vị trí GPS trong dịch vụ của tôi tất cả mọi thứ không thành công (dừng đột ngột).Dịch vụ nền cần gửi vị trí GPS trên máy chủ

Tôi đã reed rằng bạn cần phải đặt một số người nhận hoặc một cái gì đó nhưng không có gì cho đến nay hoạt động. Vì vậy, tôi sẽ rất hài lòng nếu ai đó có thể giúp tôi.

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

"mọi thứ dịch vụ của tôi không thành công (dừng đột ngột)" -> lỗi bạn đang gặp phải là gì? – Hoff

+0

Trong CatLog tôi nhận được điều này: 11-11 15: 25: 49.541: E/AndroidRuntime (229): Uncaught handler: thread thoát ra ngoài do uncaught exception –

Trả lời

33

Tôi đã làm điều này trong ứng dụng của tôi để làm điều tương tự bạn đã hỏi.

Trong dịch vụ của tôi tôi đã thêm này:

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

LƯU Ý: Xem mà tôi sử dụng MyApplication.getAppContext(); đó là vì tôi đang sử dụng lớp Ứng dụng của riêng tôi để thêm ngữ cảnh. Và sau đó tôi có một BroadcastReceiver với điều này:

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

lớp Application:

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

Cũng trong manifest của bạn, bạn cần phải thêm cả:

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

Phương pháp để phát hiện nếu dịch vụ đang chạy Tôi thực hiện thao tác này trên Hoạt động đầu tiên của tôi:

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

Rõ ràng bạn cần phải kiểm soát các SharedPreferences (thiết lập) để thiết lập các biến locationService để đúng/sai nếu dịch vụ đang chạy (onStart) hay không (onDestroy).

+0

Điều đó có vẻ hoàn hảo nhưng tôi vẫn gặp vấn đề: xxx.yyy.intent này. .. những gì để đặt thay vào đó và tôi cũng có vấn đề với MyApplication.getCOntext(), là có cách nào khác? –

+0

như tôi đã nói Bạn cần tạo một lớp mở rộng từ Ứng dụng (và thêm nó vào tệp kê khai của bạn) xxx.yyy.intent.action.LOCATION có thể là bất cứ thứ gì bạn muốn .. như tên gói của bạn và thêm intent.action .LOCATION để cụ thể hơn về nó .. Tôi sẽ chỉnh sửa câu trả lời của mình với lớp ứng dụng – SERPRO

+0

OK bây giờ tôi nhận được: W/ActivityManager (51): Không thể bắt đầu dịch vụ Intent {act = com.biromatik.GPS.MonitorService}: không tìm thấy. Bạn có thể cho tôi biết cách bắt đầu dịch vụ đó ngay bây giờ không? –

Các vấn đề liên quan