我的 android 应用程序出现错误
I am getting an error in my android application
该应用程序在 Android Jelly Bean 中运行良好,但在 Android M 中无法运行。它显示 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;
}
}
权限
<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
在 android 版本 23 及更高版本中,您必须在运行时请求权限。 IE;即使您已经在清单中声明了权限,您也应该在版本 23 及更高版本中在运行时请求权限。这就是该应用程序在 Jellybean 中运行而在 Marshmallow 中崩溃的原因。看到行 Caused by: java.lang.SecurityException: com.juggernaut.hotspot was not granted this
permission: android.permission.WRITE_SETTINGS.
它清楚地表明没有授予权限。在创建热点之前请求并获得授予的权限。有关在运行时管理权限的更多信息,请参阅 This link
该应用程序在 Android Jelly Bean 中运行良好,但在 Android M 中无法运行。它显示 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;
}
}
权限
<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
在 android 版本 23 及更高版本中,您必须在运行时请求权限。 IE;即使您已经在清单中声明了权限,您也应该在版本 23 及更高版本中在运行时请求权限。这就是该应用程序在 Jellybean 中运行而在 Marshmallow 中崩溃的原因。看到行 Caused by: java.lang.SecurityException: com.juggernaut.hotspot was not granted this
permission: android.permission.WRITE_SETTINGS.
它清楚地表明没有授予权限。在创建热点之前请求并获得授予的权限。有关在运行时管理权限的更多信息,请参阅 This link