مشكلة أثناء تنفيذ مستمع الموقع في تطبيق android appwidget

StackOverflow https://stackoverflow.com/questions/1801866

سؤال

أنا أعمل على عنصر واجهة مستخدم سيحصل على موقع 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top