最近需要在Android平台写一个处理视频帧的Demo,于是在网上下了很多的Demo代码,奇怪的是下载的很多通过Camera提取视频帧的程序在Android Studio中都能通过编译,但是每次一放到真机上一测试程序就闪退崩掉了。
我的开发环境为Android Studio 2.1,编译时的SDK选的是API 23,测试机为华为P9。
网上搜了很多资料说要在AndroidManifest文件中添加访问Camera的权限,然而我添加之后依然没有解决。这个问题折腾了我快一周,后面我才发现是权限的问题。我的测试机华为P9是Android 6的系统,而Android系统从6.0版本开始增加了一种运行时权限,Camera正好属于运行时权限,这种权限的授权不像6.0以前的Android系统可以安装APP的时候就一次性授权。综上,最后找到了程序在华为P9上一测试就崩掉的原因:程序在运行中请求camera.open()时实际上程序并未获得操作Camera的权限,所以camera.open()会一直打开失败。
问题找到了,怎么解决呐?下面介绍方法有两种。
方法一:修改编译的SDK,在src下的build.gradle中把编译的SDK改为低于23版本的SDK(因为Android 6系统对应的最低SDK版本号为API level 23)。下面是一个示例。
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "org.mogujie.guigu.camerademo"
minSdkVersion 16
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:22.0.0'
}
方法二:在Java代码中添加运行时权限授权。方法:在需要用Camera的地方添加授权代码,如在Mainactivity的onCreate函数中添加如下代码。
// check Android 6 permission
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED) {
Log.i("TEST","Granted");
//init(barcodeScannerView, getIntent(), null);
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA}, 1);//1 can be another integer
}
除此,由于以上代码来自其它包,因此还需要import下面的这些包
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.support.v4.content.ContextCompat;
import android.view.KeyEvent;
Reference:
http://www.open-open.com/lib/view/open1450578678148.html
https://github.com/open-keychain/open-keychain/blob/master/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/QrCodeCaptureActivity.java