我试图向我的 Android 应用程序添加一个段,该段将收集有关设备的信息(例如序列号),并稍后将其用于数据的数字签名。 我计划使用
getprop
函数的输出,并与足够的参数配对,例如 getprop ro.serialno
。
谷歌搜索这个问题让我走上了启用适当权限的道路,以使其发挥作用。
我在设备上启用
READ_PHONE_STATE
权限时遇到问题。将其添加到 AndroidManifest.xml 文件中绝对不会执行任何操作。当我在启动后重用一段已经可以工作的代码来请求用户的许可后,我的应用程序开始崩溃。
应用程序崩溃:
--------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.strujomeri, PID: 17563
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.strujomeri/com.strujomeri.MainActivity}: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
AndroidManifest.xml 中的所有权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
请求许可的代码。 适用于其他权限,但仅在此处崩溃:
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_PHONE_STATE},
STATE_REQUEST);
if (requestCode == STATE_REQUEST) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "State request granted", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "State request granted", Toast.LENGTH_SHORT).show();
}
}
编辑:这是我在尝试读取手机序列号时收到的错误消息:
E/libc: Access denied finding property "ro.serialno"
关于如何获取此类信息有什么想法吗?除了 getprop 之外的其他方法也很有用。谢谢你
我想在我的 Android 设备上启用 READ_PHONE_STATE 权限,我需要在代码中执行一些系统调用,但我在启用此权限时遇到了阻碍,并怀疑这个问题背后存在我不知道的理论已经知道了。
您似乎已经编辑了此处显示的代码。
java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
问题是由你的权限数组引起的。 轻松检查权限:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// Forward results to EasyPermissions
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
@AfterPermissionGranted(RC_PHONE)
private void methodRequiresTwoPermission() {
String[] perms = {Manifest.permission.READ_PHONE_STATE , Any more permission in your manifest};
if (EasyPermissions.hasPermissions(this, perms)) {
// Already have permission, do the thing
// ...
} else {
// Do not have permissions, request
}
}
如果你不想要上面的库
private boolean checkPermission(String[] perms) {
for (String perm : perms) {
if (ActivityCompat.checkSelfPermission(getApplicationContext(), perm) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
使用
if (!checkPerms(new String[]{
// //your permissions in manifest
})) {
requestPermissions(new String[]{
//your permissions in manifest
}, REQUEST_CODE);
}