Android Camera2 永久权限

Posted

技术标签:

【中文标题】Android Camera2 永久权限【英文标题】:Android Camera2 Pemanent Permission 【发布时间】:2017-02-01 18:02:24 【问题描述】:

伙计们,

有没有办法为我的应用添加永久内置摄像头权限?我的应用程序需要立即运行,因为我们不希望用户记得每天早上都初始化应用程序(应该是自动的)。我在我的 androidManifest 中添加了以下内容,但似乎不起作用:

<uses-permission
    android:required="true"
    android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera2.full" />
<uses-feature android:name="android.hardware.camera2.autofocus" />

<uses-feature android:glEsVersion="0x00020000" android:required="true" />

<application
    <activity
        android:name="com.serenegiant.usbcameratest5.MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="sensorPortrait"
        android:launchMode="singleTask" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>          
        <intent-filter>
            <action android:name="android.hardware.camera2.CameraDevice" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.hardware.camera2.CameraManager" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.hardware.camera2.CameraCharacteristics" />
        </intent-filter>           
        <meta-data
            android:name="android.hardware.camera2.CameraManager"
            android:resource="@xml/device_filter" />
        <meta-data
            android:name="android.hardware.camera2.CameraDevice"
            android:resource="@xml/device_filter" />
        <meta-data
            android:name="android.hardware.camera2.CameraMetadata"
            android:resource="@xml/device_filter" />
    </activity>
</application>

这是我尝试打开相机的代码,但程序抱怨我需要权限代码(我已将其注释掉,因为我不想要它):

    private void openCamera(int width, int height) 
//            if (ContextCompat.checkSelfPermission(mWeakParent.clear(), Manifest.permission.CAMERA)
//                    != PackageManager.PERMISSION_GRANTED) 
//                requestCameraPermission();
//                return;
//            
      setUpCameraOutputs(width, height);
      configureTransform(width, height);
      Activity activity = mWeakParent.get();
      CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
      try 
            if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) 
               throw new RuntimeException("Time out waiting to lock camera opening.");
            
            manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler);
        catch (CameraAccessException e) 
                e.printStackTrace();
        catch (InterruptedException e) 
            throw new RuntimeException("Interrupted while trying to lock camera opening.", e);
        
   

【问题讨论】:

“我们不希望用户记得每天早上都初始化应用程序”——他们只需要在您的应用程序第一次运行时授予运行时权限一次。 我明白了。也许我总是看到权限,因为每次更改代码中的某些内容时都必须重新安装应用程序。好点。 【参考方案1】:

如果您不想使用运行时权限(尽管这是一种不好的做法),那么您可以在build.gradle 文件中降低您的目标 API:

android 
compileSdkVersion 25
buildToolsVersion "25.0.1"

defaultConfig 
    applicationId "com.xaugmentedreality.arproject"
    minSdkVersion 17
    targetSdkVersion 22
    versionCode 1
    versionName "1.0"



这会使构建工具保持最新版本,但应用程序将针对 API 版本 22 及以下版本。因此,您不需要使用运行时权限。 尽管您仍然需要在清单文件中明确声明的权限:

<uses-permission android:name="android.permission.CAMERA" />

PS:

我确实将这种方式用于我的一个应用程序,因为它进行图像处理和 以具有运行时权限的版本 > 23 为目标会导致崩溃 小米和华硕设备,最难的部分是应用程序崩溃之前 甚至像 Acra 或 Crashalytics 这样的错误报告工具也会运行。所以 这应该有效,但不是推荐的选项,只有当您的 要求就够了。

【讨论】:

camera2 是否在 SDK 22 上运行?我以为 camera2 来自 API 23 相机 2 在 API 级别 21 中添加 好吧。这是有道理的 如果对您有帮助,请将答案标记为完整! 是的...我只是要自己安装应用程序,第一次接受所有权限(无论如何我需要测试每部手机),然后将其交给客户。跨度>

以上是关于Android Camera2 永久权限的主要内容,如果未能解决你的问题,请参考以下文章

支持 Android Camera Api 和 Camera2 Api 的问题

camera2(API 级别 21)是不是暴露了所有旧摄像头?

android中的camera和camera2权限

Android Camera2 教程 · 第一章 · 概览

调用需要 API 级别 21(让 camera2 在低于 21 的设备上运行?)[重复]

如何在 Android 11 中检测权限的永久拒绝?