Java Can';t在API级别正确检查权限<;23
我正在为Unity3D开发一个Android库,在检查音频权限时遇到问题。 起初我使用了ContextCompat.checkSelfPermission(),但失败了: 问题是:Java Can';t在API级别正确检查权限<;23,java,android,unity3d,permissions,Java,Android,Unity3d,Permissions,我正在为Unity3D开发一个Android库,在检查音频权限时遇到问题。 起初我使用了ContextCompat.checkSelfPermission(),但失败了: 问题是: 10-16 13:46:39.466 856-939/? E/Unity: AndroidJavaException: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/content/ContextCompat;
10-16 13:46:39.466 856-939/? E/Unity: AndroidJavaException: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/content/ContextCompat;
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/content/ContextCompat;
at com.magikid.unityplugin.RecordManager.isGotRecordPermission(RecordManager.java:431)
at com.magikid.unityplugin.RecordManager.RequestRecordPermission(RecordManager.java:370)
at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
at com.unity3d.player.UnityPlayer.c(Unknown Source)
at com.unity3d.player.UnityPlayer$c$1.handleMessage(Unknown Source)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:194)
at com.unity3d.player.UnityPlayer$c.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.content.ContextCompat" on path: DexPathList[[zip file "/data/app/com.magikid.channel-1/base.apk"],nativeLibraryDirectories=[/data/app/com.magikid.channel-1/lib/arm, /vendor/lib, /system/lib]] at dalvik."
更新API后,android.support.v4.content.ContextCompat的使用比较混乱,添加android-support-v4.jar后,问题得到了解决。我可以使用ContextCompat.checkSelfPermission或PermissionChecker.checkCallingOrSelfPermission或PermissionChecker.checkSelfPermission,不存在其他错误,但它的值总是返回所授予的权限。
然后我尝试使用PermissionChecker.checkSelfPermission()而不是添加android-support-v4.jar,看起来一切都正常了:我得到了被授予权限的检查结果,但之后当我尝试拒绝权限时,检查仍然返回了被授予的权限。
顺便说一下,我区分了不同的API lvl,下面是我的代码:
public class AppUtils
{
private static Application application;
public static void setApplication(Application application)
{
try
{
if (AppUtils.application == null)
{
AppUtils.application = application;
}
else
{
throw new IllegalStateException("Application already holded 'application'.");
}
}
catch (Exception e)
{
Log.e("UnityDebugSetApp", String.valueOf(e));
}
}
}
public class RecordManager
{
public static Context getContext()
{
return application.getApplicationContext();
}
//This method is to judge if user allows permission
public static boolean isGotRecordPermission()
{
Activity activity = UnityPlayer.currentActivity;
String permissionName = "android.permission.RECORD_AUDIO";
String pkgName = activity.getPackageName();
if (Build.VERSION.SDK_INT >= 23)
{
return PackageManager.PERMISSION_GRANTED == getAppContext().checkCallingOrSelfPermission (permissionName);
}
else
{
return PermissionChecker.PERMISSION_GRANTED == PermissionChecker.checkCallingOrSelfPermission (getAppContext(), permName);
}
}
}
这是我的身材。格雷德尔:
apply plugin: 'com.android.library'
android {
compileSdkVersion 25
buildToolsVersion "25.0.0"
defaultConfig {
minSdkVersion 21
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk {
abiFilters "armeabi-v7a", "armeabi"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
}
dependencies {
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
testCompile 'junit:junit:4.12'
provided files('libs/classes.jar')
compile files('libs/wechat-sdk.jar')
compile files('libs/flame.jar')
compile files('libs/android-support-v4.jar')
}
如果我的问题不清楚或者你需要更多的细节,请发表评论让我知道,我会尽力帮助你帮助我,谢谢 在Android 6.0(23)中引入。在Android 6.0以下的设备上,只要在AndroidManifest.xml文件中请求权限就足够了。它自动返回“已授予”。如果您的targetSdk为23或更高,则需要请求运行时权限,但如果用户的设备小于23,则忽略运行时请求权限,如果在AndroidManifest.xml内请求,则会授予您权限,因为@Faith说运行时权限api在api 23下不可用,清单文件中声明的权限已足够 android中的所有权限都添加到API 23中,在此API之下,所有权限都已通过清单授予。 所以我们需要检查android设备中运行OS版本的用户设备的API版本。 Android官方文件: 我建议使用 这个图书馆既方便又易于使用
https://github.com/NikhilJogdand/PermissionManager
所有与回调和操作系统版本检查相关的任务都由该库执行。您可以使用RxPermissions在应用程序中授予权限。它非常易于使用
RxPermissions rxPermissions = new RxPermissions(this);
rxPermissions
.request(Manifest.permission.RECORD_AUDIO)
.subscribe(granted -> {
if (granted) {
// Permission Granted
} else {
// Permission denied
}
});
有关更多信息,请点击此链接
ContextCompat.checkSelfPermission()有什么问题?您得到了什么错误?亲爱的@AbhayBohra,我已经为您更新了信息,谢谢。谢谢,但我仍然想检查权限,以确保用户是否希望在运行时使用记录函数回调:)对于URL,我已经仔细阅读了它,我无法获得较低API的解决方案。现在我知道了确切的原因:忽略,谢谢。对于较低的API没有解决方案,因为该功能是在Android 6.0中实现的,因为用户抱怨安全性,访问他们的文件,等。引入隐私策略和运行时权限,使用户可以更好地控制其设备,并了解为什么需要权限。以前的版本没有运行时权限也意味着没有解决方案,或者您被自动授予了解决方案。感谢您的建议,我正在尝试解决“订阅”中的一些问题:无法解决方法“subscribe()”,第二个“prograted”是不兼容的类型:布尔值不是必需的。如何修复它们?您是否为rxPermissions库添加了渐变依赖项?是:
依赖项{compile'com.tbruyelle.rxpermissions2:rxPermissions:0.9。4@aar“
}
存储库{jcenter()//如果还没有
},那么我添加了编译选项{sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}在gradle中,存在新错误:java.lang.NoClassDefFoundError:io.reactivex.Observable,最后这个答案救了我:并需要最新的me.tatarka.retrolambda: