Java Can';t在API级别正确检查权限<;23

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;

我正在为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,不存在其他错误,但它的值总是返回所授予的权限。 然后我尝试使用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: