Cordova 中的 android 权限问题

Issues with android permissions in Cordova

我正在为 android 开发一个演示应用程序,它需要获取有关 phone、SIM、网络等的信息。我将所有代码放在一个插件中,然后我的 Java 检索 SIM 信息的函数如下所示:


  private boolean getSIMInfo(CallbackContext cbc) throws JSONException {

    // tm is a TelephonyManager instantiated in initialize
    JSONObject res = new JSONObject()
      .put("carrierID", tm.getSimCarrierId()) 
      .put("carrierName", tm.getSimCarrierIdName())
      .put("countryIso", tm.getSimCountryIso())
      .put("operator", tm.getSimOperator())
      .put("operatorName", tm.getSimOperatorName())
      .put("state", tm.getSimState())
      .put("msisdn", tm.getLine1Number()) // <== Requires permission
      ;
    cbc.success(res);
    return true;
  }

只要我不打电话给 getLine1Number(),一切都会好起来的。

getLine1Number() 需要设置 android.permission.READ_PHONE_STATEa.p.READ_SMSa.p.READ_PHONE_NUMBERS。我首先在插件的 plugin.xml 中声明了 a.p.READ_PHONE_STATE,然后我检查它是否被注入到 AndroidManifest.xml 中。

plugin.xml 的平台部分如下所示:

  <platform name="android">

    <config-file target="res/xml/config.xml" parent="/*">
      <feature name="TelPlugin">
        <param name="android-package" value="org.buguigny.CordovaPlugin.TelPlugin"/>
      </feature>
    </config-file>

    <config-file parent="/*" target="AndroidManifest.xml" />
    <config-file target="AndroidManifest.xml" parent="/*">
      <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    </config-file>
    <source-file src="src/TelPlugin.java" target-dir="src/org/buguigny/CordovaPlugin/TelPlugin" />

  </platform>`

执行后出现错误:

getLine1NumberForDisplay: Neither user 10190 nor current process has
   android.permission.READ_PHONE_STATE, android.permission.READ_SMS, or
   android.permission.READ_PHONE_NUMBERS

我尝试了其他权限:同样的错误。

知道我做错了什么吗?

在 Android >=6.0 上,Android 应用程序应请求权限运行时。

因此在 Cordova 中,您可以使用 permission plugin 如下

permissions.requestPermission(permissions.READ_PHONE_STATE, success, error);

function error() {
  console.warn('Camera permission is not turned on');
}

function success( status ) {
  if( !status.hasPermission ) error();
}