مشكلة أثناء تنفيذ مستمع الموقع في تطبيق android appwidget
-
05-07-2019 - |
سؤال
أنا أعمل على عنصر واجهة مستخدم سيحصل على موقع GPS الحالي ويمرر هذه القيمة إلى صفحة PHP البعيدة للحصول على المعلومات وعرضها في عنصر واجهة المستخدم.وهذا ما أحاول القيام به.
أواجه مشكلة أثناء تنفيذ Location Waiter لـ appWidget.لا يتم تحديثه باستخدام الموقع الحالي ويعرض الأداة الأولية، مثل "تحميل الأداة" (هنا أضع هذا النص)
هل يمكننا تنفيذ برنامج Location Waiter لـ AppWidgetProvider؟
أو
هل يمكنك أن تقترح علي الحل المحتمل للحصول على موقع GPS في App Widget؟
لقد وضعت جميع الأذونات اللازمة في ملف البيان.
إليكم مقتطف الكود الخاص بي:
public class test extends AppWidgetProvider {
static LocationManager locMan;
static Location curLocation;
static Boolean locationChanged;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
// To prevent any ANR timeouts, we perform the update in a service
context.startService(new Intent(context, UpdateService.class));
}
public static class UpdateService extends Service {
// GPS Listener Class
LocationListener gpsListener = new LocationListener() {
public void onLocationChanged(Location location) {
// Log.w("GPS", "Started");
if (curLocation == null) {
curLocation = location;
locationChanged = true;
}
if (curLocation.getLatitude() == location.getLatitude() && curLocation.getLongitude() == location.getLongitude())
locationChanged = false;
else
locationChanged = true;
curLocation = location;
if (locationChanged)
locMan.removeUpdates(gpsListener);
}
public void onProviderDisabled(String provider) {
}
public void onProviderEnabled(String provider) {
// Log.w("GPS", "Location changed", null);
}
public void onStatusChanged(String provider, int status,
Bundle extras) {
if (status == 0)// UnAvailable
{
} else if (status == 1)// Trying to Connect
{
} else if (status == 2) {// Available
}
}
};
// In service start method, I am registering for GPS Updates
@Override
public void onStart(Intent intent, int startId) {
locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (locMan.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,20000, 1, gpsListener);
} else {
this.startActivity(new Intent("android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS"));
}
if (curLocation != null) {
double lat = curLocation.getLatitude();
double lng = curLocation.getLongitude();
Toast.makeText(getBaseContext(),"Lat : " + String.valueOf(lat) + "\n Long : "+ String.valueOf(lng), Toast.LENGTH_LONG).show();
}
// Build the widget update for today
RemoteViews updateViews = buildUpdate(this);
// Push update for this widget to the home screen
ComponentName thisWidget = new ComponentName(this,InKakinadaWidget.class);
AppWidgetManager manager = AppWidgetManager.getInstance(this);
manager.updateAppWidget(thisWidget, updateViews);
}
public RemoteViews buildUpdate(Context context) {
// Here I am updating the remoteview
return updateViews;
}
@Override
public IBinder onBind(Intent intent) {
// We don't need to bind to this service
return null;
}
}
}
شكرا لك مقدما...
With Regards, Raghavendra K.
المحلول
هل تواجه هذه المشكلة في المحاكي أو على الجهاز؟إذا كنت تستخدم المحاكي، فتأكد من استخدام DDMS لتعيين موقع GPS.ولكن قد يكون أسهل ما يمكنك فعله هو تشغيل التعليمات البرمجية الخاصة بك على الجهاز لمعرفة ما إذا كنت ستحصل على تحديثات نظام تحديد المواقع العالمي (GPS) بهذه الطريقة.
نصائح أخرى
المشكلة التي أراها هي أنك تحاول التحقق من curLocation في onStart() مباشرة بعد استدعاء requestLocationUpdates().LocationManager.requestLocationUpdates() غير متزامن، مما يعني أنه لن يتم استدعاء LocationListener مرة أخرى إلا بعد عودة onStart().اطلب من LocationListener تحديث واجهة المستخدم بعد أن يتلقى الموقع، ولا تحاول القيام بذلك في onStart.