Affectiva affdex-sdk仅兼容Android SDK22?适配高版本问题咨询
问题1:为啥示例只支持SDK版本22呢?
要知道Android 6.0(API 23)开始引入了运行时权限机制,而API 22及之前都是安装时就自动授予权限。你用的这个Affectiva示例是基于旧版SDK(3.2.0-01)开发的,当时根本没考虑运行时权限的事儿。当你把targetSdk升到23+之后,系统会严格执行新的权限规则——相机权限属于「危险权限」,必须在App运行时主动向用户请求,可示例代码里完全没加这部分逻辑,结果相机初始化的时候拿不到权限,直接就抛出IllegalStateException崩溃了。
另外旧版本的affdex-sdk内部也没适配API 23+的权限模型,还是依赖旧的自动授权机制,在高版本系统下自然就没法正常获取相机权限啦。
问题2:怎么让affdex-sdk适配新版Android SDK?
你可以按下面这几步来操作,一步步解决适配问题:
1. 优先把affdex-sdk更到最新版本
旧版本的3.x SDK大概率已经停止维护了,新版本肯定已经适配了Android 6.0+的权限机制,甚至还兼容了更高版本的系统特性。直接在build.gradle里把依赖换成最新版本就行(具体版本号可以查Affectiva官方文档确认):
implementation('com.affectiva.android:affdexsdk:4.+') // 替换为当前最新稳定版
2. 手动添加运行时权限请求逻辑
如果暂时没法升级SDK,或者新版本仍需要自己处理权限,那就得在启动相机前主动请求相机权限:
- 先确保
AndroidManifest.xml里已经声明了相机相关权限:
<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />
- 然后在启动相机的Activity里,加上权限检查和请求的代码:
private static final int CAMERA_PERMISSION_REQUEST_CODE = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 先检查相机权限有没有拿到 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // 没权限就主动向用户请求 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST_CODE); } else { // 权限已经有了,直接初始化相机 initCamera(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 用户同意了权限,赶紧初始化相机 initCamera(); } else { // 用户拒绝了,提示一下然后退出吧 Toast.makeText(this, "需要相机权限才能正常运行哦", Toast.LENGTH_SHORT).show(); finish(); } } } private void initCamera() { // 这里放你原来的相机初始化逻辑,比如创建CameraDetector之类的代码 }
3. 调整build.gradle的配置
把compileSdkVersion和targetSdkVersion更新到你需要的版本(比如现在主流的33),同时确保buildToolsVersion和compileSdkVersion匹配:
android { compileSdkVersion 33 defaultConfig { minSdkVersion 21 targetSdkVersion 33 // 其他原有配置不变... } buildToolsVersion '33.0.2' // 版本号和compileSdk对应上就行 }
4. 检查相机初始化逻辑
如果权限处理完还是崩溃,可能是旧版本SDK的相机初始化方式在高版本Android上不兼容——比如Android 10(API 29)的Scoped Storage、Android 11(API 30)的权限限制这些,旧SDK都没适配。这种情况下,升级到最新版的affdex-sdk是最稳妥的解决办法,官方肯定已经修复了这些兼容性问题。
内容的提问来源于stack exchange,提问作者BetterSaveThanSorry

