0

民間,Android Camera2 Pemanent權限

有沒有辦法給我的應用添加永久性的內置攝像頭權限?我的應用程序需要立即工作,因爲我們不希望用戶記住每一個煩人的應該初始化應用程序(應該是自動的)。我增加了以下我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); 
     } 
    } 
+0

「我們不希望用戶記得每次都急於初始化應用程序」 - 他們只需在第一次運行應用程序時授予運行時權限一次。 – CommonsWare

+0

我明白了。也許我總是看到權限,因爲我每次更改代碼中的某些內容時都必須重新安裝應用程序。好點子。 – Pototo

回答

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:

我使用這種方式爲我的應用程序之一,因爲它的圖像處理和 針對具有運行時權限的Version> 23導致在 Mi和Asus設備中崩潰,而最困難的部分是應用程序在 之前崩潰,即使是像Acra或Crashalytics這樣的錯誤報告工具也會運行。所以 這應該工作,但不是一個推薦的選擇,只有當你的 要求足夠。

+0

camera2是否在SDK 22上運行?我認爲camera2來自API 23 – Pototo

+0

相機2是**在API級別21 ** – OBX

+0

Aight中添加的。這很有道理 – Pototo