Android 6 camera.open()异常解决方法

来源:互联网 发布:淘宝客服退换货话术 编辑:程序博客网 时间:2024/05/16 05:13

最近需要在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

0 0
原创粉丝点击