2010-01-02 19 views
20

Tôi đang cố gắng sử dụng yêu cầu LocationManager của AndroidLocationUpdate. Mọi thứ đều hoạt động cho đến khi tôi thử trích xuất đối tượng vị trí thực tế trong bộ thu phát sóng của tôi. Tôi có cần xác định cụ thể "tính năng bổ sung" cho mục đích tùy chỉnh của mình để Android LocationManager trước khi tôi chuyển nó tới requestLocationUpdates để biết cách thêm nó vào mục đích hay nó sẽ tạo gói phụ cho dù nó vượt qua ý định của người phát sóng?Android: Cách nhận thông tin vị trí từ các tính năng bổ sung của gói ý định khi sử dụng LocationManager.requestLocationUpdates()

Mã của tôi trông như thế này:

Intent intent = new Intent("com.myapp.swarm.LOCATION_READY"); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 
    0, intent, 0); 

//Register for broadcast intents 
int minTime = 5000; 
int minDistance = 0; 
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, 
    minDistance, pendingIntent); 

Tôi có một máy thu phát sóng được xác định trong bản tuyên ngôn như:

<receiver android:name=".LocationReceiver"> 
    <intent-filter> 
     <action android:name="com.myapp.swarm.LOCATION_READY" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</receiver> 

Và phát sóng nhận lớp như:

public class LocationReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    //Do this when the system sends the intent 
    Bundle b = intent.getExtras(); 
    Location loc = (Location)b.get("KEY_LOCATION_CHANGED"); 

    Toast.makeText(context, loc.toString(), Toast.LENGTH_SHORT).show(); 
    } 
} 

Đối tượng "loc" của tôi sắp hết.

+0

hãy nhớ KIỂM TRA NULL - không phải tất cả những mục đích này đều chứa đối tượng 'Vị trí' –

Trả lời

20

OK, tôi cố gắng sửa chữa nó bằng cách thay đổi KEY_LOCATION_CHANGED trong mã thu phát sóng để:

public class LocationReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    //Do this when the system sends the intent 
    Bundle b = intent.getExtras(); 
    Location loc = (Location)b.get(android.location.LocationManager.KEY_LOCATION_CHANGED); 

    Toast.makeText(context, loc.toString(), Toast.LENGTH_SHORT).show(); 
    } 
} 
14

tôi đã cố gắng để mã và thử nghiệm các giải pháp bạn đề xuất, kể từ khi tôi đang phải đối mặt với vấn đề tương tự liên quan đến cảnh báo sự gần gũi và ý định mang vật thể vị trí. Theo thông tin bạn cung cấp, bạn đã quản lý để khắc phục việc truy xuất đối tượng null, bên phía BroadcastReceiver. Những gì bạn có thể không quan sát là bây giờ bạn sẽ nhận được cùng một vị trí như là một trong những ý định của bạn lần đầu tiên được tạo ra (cũng thấy nó như là: intent caching problem).

Để khắc phục sự cố này, tôi đã sử dụng FLAG_CANCEL_CURRENT, như được nhiều người đề xuất ở đây và nó hoạt động khá tốt, tìm nạp các giá trị vị trí mới (và ngon ngọt: P). Vì vậy, các dòng xác định ý định cấp phát của bạn sẽ giống như thế này:

PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 
    0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

Tuy nhiên, bạn có thể bỏ qua này nếu:

  • mục đích của bạn là chỉ để nhận được một giá trị vị trí một lần
  • bạn quản lý để vượt qua theo cách khác không hiển thị trong bài đăng của bạn
+0

Man, bạn đã lưu ngày của tôi. : D – Davita

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