我在Android应用程序中收到错误

时间:2017-07-09 08:48:20

标签: android permissions wifi invocationtargetexception hotspot

App在Android Jelly Bean中正常运行,但在Android M上无效。有时它会说InvocationTargetException,请告诉我是否需要指定更多代码。

OnOfHotspot.java

// toggle wifi hotspot on or off
public static boolean configApState(Context context, boolean apState) {

    WifiManager wifimanager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    wifimanager.setWifiEnabled(false);
    try {
        if (apState) {
            WifiConfiguration netConfig = new WifiConfiguration();

            netConfig.SSID = hotspotName;
            netConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);

            Method method = WifiManager.class.getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
            method.invoke(wifimanager, netConfig, apState);
            Toast.makeText(context, "WiFi Hotspot \'" + config.SSID + "\' is Created!", Toast.LENGTH_SHORT).show();
            return true;
        } else {

            Method method = WifiManager.class.getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
            method.invoke(wifimanager, config, false);
            Toast.makeText(context, "WiFi Hotspot \'" + config.SSID + "\' is Disabled!", Toast.LENGTH_SHORT).show();
            return true;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

public static WifiConfiguration getApConfiguration(Context context) {

    WifiConfiguration config = null;
    WifiManager wifimanager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    Method[] methods = WifiManager.class.getDeclaredMethods();
    for (Method m : methods) {
        if (m.getName().equals("getWifiApConfiguration")) {
            try {
                config = (WifiConfiguration) m.invoke(wifimanager);
            } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                Log.d("Testing", e.getCause().toString());
            }
        }
    }
    OnOfHotspot.config = config;
    return config;
}

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;
      }
 }

权限

<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

  

解决方案:我只需添加此方法即可获取WRITE_SETTING   权限。

 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);

        }
    }
}
  

并在onClick

中调用writePermission()

1 个答案:

答案 0 :(得分:0)

在Android版本23及更高版本中,您必须在运行时请求权限。即;即使您已在清单中声明了权限,也应在版本23及更高版本的运行时请求权限。这就是为什么该应用程序在Jellybean工作并在Marshmallow坠毁。请参阅第Caused by: java.lang.SecurityException: com.juggernaut.hotspot was not granted this permission: android.permission.WRITE_SETTINGS.行明确说明未授予权限。在创建热点之前请求并获得授予的权限。有关在运行时管理权限的更多信息,请参阅This link