在AndroidManifest.xml中添加READ_PHONE_STATE权限不足以允许调用getprop函数

问题描述 投票:0回答:1

我试图向我的 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 权限,我需要在代码中执行一些系统调用,但我在启用此权限时遇到了阻碍,并怀疑这个问题背后存在我不知道的理论已经知道了。

android android-permissions serial-number
1个回答
0
投票

您似乎已经编辑了此处显示的代码。

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.