【发布时间】:2017-10-16 05:10:26
【问题描述】:
我正在为 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;
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,不存在其他错误,但它的值总是返回PERMISSION_GRANTED。 然后我尝试在 Cannot resolve method “checkSelfPermission” 中使用 PermissionChecker.checkSelfPermission() 并添加 android-support-v4.jar,看起来一切正常:我得到了 PERMISSION_GRANTED 的检查结果,但是在那之后,当我试图拒绝该权限时,检查仍然返回PERMISSION_GRANTED。 顺便说一句,我已经区分了不同的 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);
}
}
}
这是我的 build.gradle:
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')
}
如果我的问题不清楚或者您需要更多详细信息,请评论让我知道,我会尽力帮助您帮助我,非常感谢!
【问题讨论】:
-
ContextCompat.checkSelfPermission() 有什么问题?你遇到了什么错误?
-
亲爱的@AbhayBohra,我已经为你更新了信息,谢谢。
标签: java android unity3d permissions