androidpermissionswifiinvocationtargetexceptionhotspot

I am getting an error in my android application


The App is working fine in Android Jelly Bean, but it not working on Android M. It says InvocationTargetException.

MainActivity.java

     @Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.enableWifiHotSpotId:
            try {
                if (!((editText.getText().toString()).equals(""))) {
                    OnOfHotspot.hotspotName = editText.getText().toString();
                    OnOfHotspot.getApConfiguration(this);
                    OnOfHotspot.configApState(this, true);
                }else {
                    Toast.makeText(getApplicationContext(),"Please Specify Hotspot name!",Toast.LENGTH_LONG).show();
                }

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

        case R.id.disableWifiHotspotId:
            try {
                OnOfHotspot.getApConfiguration(this);
                OnOfHotspot.configApState(this, false);
            } catch (Exception e) {
                e.printStackTrace();
            }
            break;
      }
 }

Permissions

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>

Logcat

07-09 14:04:23.869 29724-29724/com.juggernaut.hotspot W/System.err:java.lang.reflect.InvocationTargetException
07-09 14:04:23.874 432-3097/? D/APM-AudioPolicyManager: startOutput()--
07-09 14:04:23.879 29724-29724/com.juggernaut.hotspot W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
07-09 14:04:23.879 29724-29724/com.juggernaut.hotspot W/System.err:     at com.juggernaut.hotspot.OnOfHotspot.configApState(OnOfHotspot.java:47)
07-09 14:04:23.879 29724-29724/com.juggernaut.hotspot W/System.err:     at com.juggernaut.hotspot.MainActivity.onClick(MainActivity.java:48)
07-09 14:04:23.879 29724-29724/com.juggernaut.hotspot W/System.err:     at android.view.View.performClick(View.java:5233)
07-09 14:04:23.879 29724-29724/com.juggernaut.hotspot W/System.err:     at android.view.View$PerformClick.run(View.java:21209)
07-09 14:04:23.879 29724-29724/com.juggernaut.hotspot W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
07-09 14:04:23.879 29724-29724/com.juggernaut.hotspot W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
07-09 14:04:23.879 29724-29724/com.juggernaut.hotspot W/System.err:     at android.os.Looper.loop(Looper.java:152)
07-09 14:04:23.879 29724-29724/com.juggernaut.hotspot W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5497)
07-09 14:04:23.879 29724-29724/com.juggernaut.hotspot W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
07-09 14:04:23.879 29724-29724/com.juggernaut.hotspot W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
07-09 14:04:23.879 29724-29724/com.juggernaut.hotspot W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-09 14:04:23.879 29724-29724/com.juggernaut.hotspot W/System.err: Caused by: java.lang.SecurityException: com.juggernaut.hotspot was not granted  this 
permission: android.permission.WRITE_SETTINGS.
07-9 14:04:23.883 29724-29724/com.juggernaut.hotspot W/System.err:     at android.os.Parcel.readException(Parcel.java:1620)
07-09 14:04:23.883 29724-29724/com.juggernaut.hotspot W/System.err:     at android.os.Parcel.readException(Parcel.java:1573)
07-09 14:04:23.883 29724-29724/com.juggernaut.hotspot W/System.err:     at android.net.wifi.IWifiManager$Stub$Proxy.setWifiApEnabled(IWifiManager.java:1511)
07-09 14:04:23.883 29724-29724/com.juggernaut.hotspot W/System.err:     at android.net.wifi.WifiManager.setWifiApEnabled(WifiManager.java:1590)
07-09 14:04:23.883 29724-29724/com.juggernaut.hotspot W/System.err:     ... 12 more

Github link

Solution : I just have to add this method for getting WRITE_SETTING permission.

 public void writePermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (!Settings.System.canWrite(getApplicationContext())) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, 200);

        }
    }
}

And call writePermission() within onClick


Solution

  • In android version 23 and above you have to request permissions at runtime. ie; even if you have declared the permission in the manifest, you should ask for the permission at runtime in version 23 and above. That is why the app worked in Jellybean and crashed in Marshmallow. See the line Caused by: java.lang.SecurityException: com.juggernaut.hotspot was not granted this permission: android.permission.WRITE_SETTINGS. it clearly says that the permission is not granted. Request and get the permission granted before creating the hotspot. Please see This link for more information managing permissions at runtime