0

こんにちは以下は、Android 2.3.6以下のすべてのデバイスで完全に機能するが、ICSおよびJellybeanでは機能しないgps設定を確認するための私のコードです。デバイスで GPS 設定が有効になっているかどうかを確認し、ロケーション設定インテントを開始して GPS を有効にしてアプリに戻ると、再度 GPS を確認しても無効と表示され、アプリを強制終了します

    public GPSTracker(Context context) {
        this.mContext = context;
        getLocation();
    }

        public Location getLocation() {
                try {





                    locationManager = (LocationManager) mContext
                            .getSystemService(LOCATION_SERVICE);

                    // getting GPS status
                    isGPSEnabled = locationManager
                            .isProviderEnabled(LocationManager.GPS_PROVIDER);

                    // getting network status
                    isNetworkEnabled = locationManager
                            .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

                   // if (!isGPSEnabled && !isNetworkEnabled) 
                    if (!isGPSEnabled && !isNetworkEnabled)
                    {
                        // no network provider is enabled
                    } else {
                        this.canGetLocation = true;
                        // First get location from Network Provider
                        if (isNetworkEnabled) {
                            locationManager.requestLocationUpdates(
                                    LocationManager.NETWORK_PROVIDER,
                                    MIN_TIME_BW_UPDATES,
                                    MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                            Log.d("Network", "Network");
                            if (locationManager != null) {
                             location = locationManager


                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
                                if (location != null) {
                                    latitude = location.getLatitude();
                                    longitude = location.getLongitude();
                                }
                            }
                        }
                        // if GPS Enabled get lat/long using GPS Services
                        if (isGPSEnabled) {
                            if (location == null) {
                                locationManager.requestLocationUpdates(
                                        LocationManager.GPS_PROVIDER,
                                        MIN_TIME_BW_UPDATES,
                                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                                Log.d("GPS Enabled", "GPS Enabled");
                                if (locationManager != null) {
                                    location = locationManager
                                            .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                                    if (location != null) {
                                        latitude = location.getLatitude();
                                        longitude = location.getLongitude();

                                    }
                                }
                            }
                        }
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }



                return location;
            }





        /**
         * Function to get latitude
         * */
        public double getLatitude(){
            if(location != null){
                latitude = location.getLatitude();
            }

            // return latitude
            return latitude;
        }

        /**
         * Function to get longitude
         * */
        public double getLongitude(){
            if(location != null){
                longitude = location.getLongitude();
            }

            // return longitude
            return longitude;
        }

        public boolean canGetLocation() {
            return this.canGetLocation;
        }

        /**
         * Function to show settings alert dialog
         * */
        public void showSettingsAlert(){
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

            // Setting Dialog Title
            alertDialog.setTitle("GPS is settings");

            // Setting Dialog Message
            alertDialog.setMessage("GPS is not enabled. Do you want to go to
                settings menu?");

            // Setting Icon to Dialog
            //alertDialog.setIcon(R.drawable.delete);

            // On pressing Settings button
            alertDialog.setPositiveButton("Settings", new 

                       DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog,int which) {
                    Intent intent = new 
                            Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    mContext.startActivity(intent);
                }
            });

            // on pressing cancel button
            alertDialog.setNegativeButton("Cancel", new 
             DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
                }
            });

            // Showing Alert Message
            alertDialog.show();
        }

そして、これは私がlogcatで得るものです

                01-09 14:53:14.190: E/StrictMode(555): class com.android.settings.Settings$LocationSettingsActivity; instances=2; limit=1
01-09 14:53:14.190: E/StrictMode(555): android.os.StrictMode$InstanceCountViolation: class com.android.settings.Settings$LocationSettingsActivity; instances=2; limit=1
01-09 14:53:14.190: E/StrictMode(555):  at android.os.StrictMode.setClassInstanceLimit(StrictMode.java:1)
01-09 14:53:14.637: E/StrictMode(555): A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
01-09 14:53:14.637: E/StrictMode(555): java.lang.Throwable: Explicit termination method 'close' not called
01-09 14:53:14.637: E/StrictMode(555):  at dalvik.system.CloseGuard.open(CloseGuard.java:184)
01-09 14:53:14.637: E/StrictMode(555):  at android.content.ContentResolver$CursorWrapperInner.<init>(ContentResolver.java:1581)
01-09 14:53:14.637: E/StrictMode(555):  at android.content.ContentResolver.query(ContentResolver.java:320)
01-09 14:53:14.637: E/StrictMode(555):  at com.android.settings.LocationSettings.onStart(LocationSettings.java:62)
01-09 14:53:14.637: E/StrictMode(555):  at android.app.Fragment.performStart(Fragment.java:1493)
01-09 14:53:14.637: E/StrictMode(555):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:829)
01-09 14:53:14.637: E/StrictMode(555):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:998)
01-09 14:53:14.637: E/StrictMode(555):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:981)
01-09 14:53:14.637: E/StrictMode(555):  at android.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1700)
01-09 14:53:14.637: E/StrictMode(555):  at android.app.Activity.performStart(Activity.java:4481)
01-09 14:53:14.637: E/StrictMode(555):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1928)
01-09 14:53:14.637: E/StrictMode(555):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
01-09 14:53:14.637: E/StrictMode(555):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
01-09 14:53:14.637: E/StrictMode(555):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
01-09 14:53:14.637: E/StrictMode(555):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-09 14:53:14.637: E/StrictMode(555):  at android.os.Looper.loop(Looper.java:137)
01-09 14:53:14.637: E/StrictMode(555):  at android.app.ActivityThread.main(ActivityThread.java:4340)
01-09 14:53:14.637: E/StrictMode(555):  at java.lang.reflect.Method.invokeNative(Native Method)
01-09 14:53:14.637: E/StrictMode(555):  at java.lang.reflect.Method.invoke(Method.java:511)
01-09 14:53:14.637: E/StrictMode(555):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-09 14:53:14.637: E/StrictMode(555):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-09 14:53:14.637: E/StrictMode(555):  at dalvik.system.NativeStart.main(Native Method)
01-09 14:53:14.647: W/CursorWrapperInner(555): Cursor finalized without prior close()
01-09 14:53:14.677: E/System(555): Uncaught exception thrown by finalizer
01-09 14:53:14.877: E/System(555): java.lang.IllegalStateException: Binder has been finalized!
01-09 14:53:14.877: E/System(555):  at android.os.BinderProxy.transact(Native Method)
01-09 14:53:14.877: E/System(555):  at android.database.BulkCursorProxy.close(BulkCursorNative.java:288)
01-09 14:53:14.877: E/System(555):  at android.database.BulkCursorToCursorAdaptor.close(BulkCursorToCursorAdaptor.java:133)
01-09 14:53:14.877: E/System(555):  at android.database.CursorWrapper.close(CursorWrapper.java:45)
01-09 14:53:14.877: E/System(555):  at android.content.ContentResolver$CursorWrapperInner.close(ContentResolver.java:1586)
01-09 14:53:14.877: E/System(555):  at android.content.ContentQueryMap.close(ContentQueryMap.java:173)
01-09 14:53:14.877: E/System(555):  at android.content.ContentQueryMap.finalize(ContentQueryMap.java:179)
01-09 14:53:14.877: E/System(555):  at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:182)
01-09 14:53:14.877: E/System(555):  at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:168)
01-09 14:53:14.877: E/System(555):  at java.lang.Thread.run(Thread.java:856)
4

2 に答える 2

0

解決した、

バージョン<2.3.6で動作するメインスレッドでインターネットにアクセスしようとしたため、この問題に直面していましたが、メインスレッド例外でネットワークを生成するため、これは上位バージョンではサポートされていません。このため、アプリからインターネットを使用している間は、常に Asynctask を使用することをお勧めします。今では私と完全にうまく機能しています。

于 2013-01-25T07:21:49.467 に答える
0

まず、間違った設定ライブラリにインポートしていないことを確認してください。と を使用する必要がありandroid.provider.Settingsますandroid support library。v4.2 の GS3 で動作しています。

また、LogCat を見ると、LocalSettings の 2 つのインスタンスが何らかの方法で実行されているように見えます。電話設定にアクセスして、同じアクティビティを 2 つ同時にインスタンス化していないことを確認してください。Strict Mode は、1 を予期しているときに 2 つのインスタンスが開いていることを好まないように思われるため、プログラムを強制終了します。これはあなたの質問に答えないかもしれませんが、おそらくあなたを正しい方向に向けるでしょう.

StrictMode$InstanceCountViolation: class LocationSettingsActivity; instances=2; limit=1

関連項目:

Android アクティビティのライフサイクル

Android 厳密モード

StrictMode インスタンス数違反

于 2013-01-24T08:23:28.260 に答える