location sendExtraCommands — метод не работает и закрывает приложение

Я пытаюсь очистить gps-чип своего смартфона программно, используя метод sendExtraCommand(). В моем файле манифеста я добавил разрешение на отправку дополнительных команд, например:

<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>

Сам метод я вызываю так:

locationManager.sendExtraCommand(LocationManager.GPS_PROVIDER, "delete_aiding_data", null)

Когда я пробую это на эмуляторе или на своем смартфоне, приложение вылетает. Я не знаю, что я делаю неправильно, поэтому я был бы очень признателен, если бы кто-то мог взглянуть на мою проблему.

Моя единственная активность, MainActivity:

    public class MainActivity extends AppCompatActivity {

        private TextView textView;
        private Button button;
        private LocationManager locationManager;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            textView = (TextView) findViewById(R.id.txtView1);
            textView.setText("Gps Reset: ");

            button = (Button) findViewById(R.id.button);

            locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

            boolean enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    System.out.println(enabled);

            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    sendXtraCommand();
                }
            });

        }

        private void sendXtraCommand(){
            boolean reset = locationManager.sendExtraCommand(LocationManager.GPS_PROVIDER, "delete_aiding_data", null);
            if(reset){
                textView.append("true");
            }else{
                textView.append("false");
            }
        }
    }

И вот мой файл манифеста:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.felix.resetgps">

        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
        <uses-feature android:name="android.hardware.location.gps" />
        <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.INTERNET"/>

        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>

    </manifest>

Это сообщение, которое я получаю в консоли:

    11/25 14:32:41: Launching app
    $ adb shell am start -n         "com.example.felix.resetgps/com.example.felix.resetgps.MainActivity" -a         android.intent.action.MAIN -c android.intent.category.LAUNCHER -D
    Waiting for application to come online: com.example.felix.resetgps | com.example.felix.resetgps.test
    Waiting for application to come online: com.example.felix.resetgps | com.example.felix.resetgps.test
    Connecting to com.example.felix.resetgps
    I/art: Not late-enabling -Xcheck:jni (already on)
    W/art: Unexpected CPU variant for X86 using defaults: x86
    W/ActivityThread: Application com.example.felix.resetgps is waiting for the debugger on port 8100...
    I/System.out: Sending WAIT chunk

          [ 11-25 13:32:41.598  1794: 1815 D/         ]
          HostConnection::get() New Host Connection established 0x8bf7f400, tid 1815
    I/art: Debugger is active
    Connected to the target VM, address: 'localhost:8615', transport: 'socket'
    I/System.out: Debugger has connected
    I/System.out: waiting for debugger to settle...
    I/System.out: waiting for debugger to settle...
    I/System.out: waiting for debugger to settle...
    I/System.out: waiting for debugger to settle...
    I/System.out: waiting for debugger to settle...
    I/System.out: waiting for debugger to settle...
    I/System.out: waiting for debugger to settle...
    I/System.out: debugger has settled (1396)
    W/System: ClassLoader referenced unknown path: /data/app/com.example.felix.resetgps-1/lib/x86
    I/InstantRun: Instant Run Runtime started. Android package is com.example.felix.resetgps, real application class is null.
    W/System: ClassLoader referenced unknown path: /data/app/com.example.felix.resetgps-1/lib/x86
    I/art: Starting a blocking GC Instrumentation
    W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
    I/System.out: true
    I/OpenGLRenderer: Initialized EGL, version 1.4
    D/OpenGLRenderer: Swap behavior 1
    D/AndroidRuntime: Shutting down VM
    E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.felix.resetgps, PID: 4869
              java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission.
                  at android.os.Parcel.readException(Parcel.java:1683)
                  at android.os.Parcel.readException(Parcel.java:1636)
                  at android.location.ILocationManager$Stub$Proxy.sendExtraCommand(ILocationManager.java:1274)
                  at android.location.LocationManager.sendExtraCommand(LocationManager.java:2226)
                  at com.example.felix.resetgps.MainActivity.sendXtraCommand(MainActivity.java:51)
                  at com.example.felix.resetgps.MainActivity.access$000(MainActivity.java:16)
                  at com.example.felix.resetgps.MainActivity$1.onClick(MainActivity.java:44)
                  at android.view.View.performClick(View.java:5610)
                  at android.view.View$PerformClick.run(View.java:22265)
                  at android.os.Handler.handleCallback(Handler.java:751)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6077)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
    Disconnected from the target VM, address: 'localhost:8615', transport: 'socket'

person Felix    schedule 25.11.2017    source источник


Ответы (1)


Если внимательно посмотреть на бревенчатую кошку, то можно обнаружить, что

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

пропал, отсутствует.

Для Android, работающего на Android 6.0 (уровень API 23) и выше, нам нужно добавить разрешение во время выполнения для работы.

Обратитесь к этому ответу, чтобы реализовать его:

разрешения ACCESS_FINE_LOCATION

person Suraj Nair    schedule 25.11.2017
comment
Привет, Сурья, спасибо за ответ. Да, ошибка говорит об этом, но у меня это разрешение уже есть в моем манифесте. - person Felix; 25.11.2017
comment
Попробуйте добавить динамическое разрешение, возможно, это решит вашу проблему, вы можете сослаться на эту ссылку > stackoverflow.com/questions/46915957/ - person Suraj Nair; 25.11.2017
comment
Пожалуйста, примите ответ, это поможет другим, если они застряли в той же проблеме :) - person Suraj Nair; 25.11.2017
comment
@Suraj, вам нужно обновить свой ответ до фактического решения (разрешения во время выполнения), прежде чем он будет принят. - person Sean Barbeau; 26.11.2017