san*_*nti 2 permissions android cordova android-6.0-marshmallow
我继承了一个Cordova混合应用程序,其清单文件中有错误.targetSdkVersion设置为24,就我而言尚不存在.
该应用未在Android 6设备上进行测试,因此上传到Play商店时出现该错误.由于Android 6上的权限模型已更改了这些设备上的应用程序崩溃.
03-12 21:10:05.991 24366-24475/? E/PluginManager? Uncaught exception from plugin
java.lang.SecurityException: getDeviceId: Neither user 10111 nor current process has android.permission.READ_PHONE_STATE.
at android.os.Parcel.readException(Parcel.java:1620)
at android.os.Parcel.readException(Parcel.java:1573)
at com.android.internal.telephony.ITelephony$Stub$Proxy.getDeviceId(ITelephony.java:4207)
at android.telephony.TelephonyManager.getDeviceId(TelephonyManager.java:706)
at org.pgsqlite.SQLitePlugin.getAppKey(SQLitePlugin.java:783)
at org.pgsqlite.SQLitePlugin.executeSqlBatch(SQLitePlugin.java:347)
at org.pgsqlite.SQLitePlugin.executeAndPossiblyThrow(SQLitePlugin.java:195)
at org.pgsqlite.SQLitePlugin.execute(SQLitePlugin.java:93)
at org.apache.cordova.CordovaPlugin.execute(CordovaPlugin.java:95)
at org.apache.cordova.PluginManager.exec(PluginManager.java:130)
at org.apache.cordova.CordovaBridge.jsExec(CordovaBridge.java:59)
at org.apache.cordova.engine.SystemExposedJsApi.exec(SystemExposedJsApi.java:41)
at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:39)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
Run Code Online (Sandbox Code Playgroud)
感谢这个博客,我发现如果我将targetSdkVersion更改为22,则应用程序的工作方式与以前一样 http://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/EN
和文档演示了如何在运行时问权限: http://developer.android.com/intl/es/training/permissions/requesting.html
关于这个问题,我有几个问题.
这是我的manifest.xml文件.
<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0" android:windowSoftInputMode="adjustResize" package="com.myorg.myapp" xmlns:android="http://schemas.android.com/apk/res/android">
<supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="24" />
<application android:allowBackup="true" android:icon="@drawable/icon" android:label="@string/app_name">
<blablabla />
</application>
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
</manifest>
Run Code Online (Sandbox Code Playgroud)
如果我将targetSdkVersion降级为22(或23)并将应用程序上传到Play商店,如果我增加版本,应用会更新吗?我真的不知道会发生什么.
您可以将针对API 22构建的新应用程序上传到Play商店,然后针对API 23上传构建 - 这将正常工作.但是(正如@jcesarmobile在评论中指出的那样),如果你在Play商店中有一个已经通过API 23上传的现有应用,我们非常确定谷歌不会让你降级到API 22.所以你的选择是修复它为API 23(最佳选项)或以其他方式更改包名称并将其发布为使用API 22构建的新应用程序,然后删除旧的(不理想).
目前没有什么可以迫使你构建针对API 23的,所以在短期内你可以继续构建和部署API 22.但是,我认为在某些时候谷歌将要求上传的构建使用API 23,否则类型运行时权限旨在打击的恶意应用程序将继续构建针对API 22并绕过运行时权限
我应该如何使用Cordova应用程序上的Android Marshmallow权限?我是否应该要求在安装后覆盖Cordova创建的默认活动的活动?
Cordova(例如cordova-plugin-camera)提供的大多数(如果不是全部)核心插件以及一些第三方插件已经更新,以请求他们在API 23上构建/运行时使用的必要运行时权限.所以首先要做的是制作确保项目中的插件与最新版本保持同步.我写了一个小工具来管理插件更新,这使得这个过程更容易:cordova-check-plugins.
从您发布的错误消息中可以看出,崩溃是由于READ_PHONE_STATE插件未请求的权限,该插件看起来像是SQLite存储插件.不确定此插件是否已更新为请求/单步执行运行时权限,因此请先检查该插件.一个简单的插件更新可能会解决这个问题.
如果没有,或者对于尚不支持请求API 23运行时权限的其他插件,您有两个选择:
修改插件源代码以请求必要的运行时权限.这将需要一些Java手术.Cordova插件使用可重复使用的Permission帮助程序类,这使得这更容易.您可以选择使用拉取请求将更改反馈给插件作者.
使用cordova-plugin-diagnostic来请求不兼容插件所需的权限.这可以在Javascript层中完成,不需要修改插件源代码.
首先,您需要确定插件使用的权限.您可以在plugin.xml中查找.如果由于某种原因插件没有将相关<uses-permission/>元素添加到AndroidManifest.xml,您可以将其显式添加到config.xml(请注意,cordova-plugin-dignostic不会<uses-permission/>为您添加元素).
然后通过调用cordova-diagnostic-plugin将Javascript调用包装到插件中,以检查并根据需要请求相关的运行时权限.以READ_PHONE_STATE身份为例:
function requestPermission(){
cordova.plugins.diagnostic.requestRuntimePermission(function(status){
switch(status){
case cordova.plugins.diagnostic.runtimePermissionStatus.GRANTED:
console.log("Permission granted (or already granted) - call the plugin");
// call SQLite plugin
break;
case cordova.plugins.diagnostic.runtimePermissionStatus.DENIED:
console.log("Permission denied - ask again");
alert("Come on user, we really need this. I'll ask again...");
requestPermission();
break;
case cordova.plugins.diagnostic.runtimePermissionStatus.DENIED_ALWAYS:
console.log("Permission permanently denied");
alert("Well that's it, we're dead Jim");
navigator.app.exitApp();
break;
}
}, function(error){
console.error("The following error occurred: "+error);
}, cordova.plugins.diagnostic.runtimePermission.READ_PHONE_STATE);
}
requestPermission();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5174 次 |
| 最近记录: |