Android:android.permission.CAMERA,但在AndroidManifest.xml文件中找不到

时间:2018-04-12 20:19:54

标签: android xamarin xamarin.android android-camera android-manifest

我的Android应用程序有时会在启动应用程序时随机崩溃,当我检查我的分析报告时,我得到的例外是:

  

{第三方工具}需要android.permission.CAMERA,但不是   可在AndroidManifest.xml文件中找到。

     

PermissionsHandler.CheckPermissions(Android.Content.Context context,   System.String权限,System.Boolean throwOnError)

     

PermissionsHandler.CheckCameraPermissions(Android.Content.Context   context,System.Boolean throwOnError)CameraController.SetupCamera   ()   CameraAnalyzer.SetupCamera()

我用于条形码的工具甚至在用户导航到某个页面之前甚至不使用相机服务。我只是觉得可能在运行时它正在寻找相机权限,有时候应用程序清单没有准备好或者没有加载,因此应用程序假定相机权限不包含在appmanifest中,即使它们是。

我的问题是

  1. Andorid是否在应用程序启动时立即显示,或者我是否必须对应用程序进行一些更改以确保它等待直到使用所有权限设置准备好它?
  2. 是否有人遇到类似错误或建议任何解决方案?
  3. 更新 ZXing是第三方工具,需要相机服务。但是,一旦应用程序启动,在某些页面中会调用此三十方API,并且在这些页面上它会请求相机权限,但应用程序会在启动时崩溃,但会出现以下异常: 例外:

    PermissionsHandler.CheckPermissions (Android.Content.Context context, System.String permission, System.Boolean throwOnError)
    System.UnauthorizedAccessException: ZXing.Net.Mobile requires: android.permission.CAMERA, but was not found in your AndroidManifest.xml file.
    
    PermissionsHandler.CheckPermissions (Android.Content.Context context, System.String permission, System.Boolean throwOnError)
    
    PermissionsHandler.CheckCameraPermissions (Android.Content.Context context, System.Boolean throwOnError)
    
    CameraController.SetupCamera ()
    
    CameraAnalyzer.SetupCamera ()
    
    ZXingSurfaceView+<SurfaceCreated>d__3.MoveNext ()
    
    ExceptionDispatchInfo.Throw ()
    
    AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_0 (System.Object state)
    
    SyncContext+<>c__DisplayClass2_0.<Post>b__0 ()
    
    Thread+RunnableImplementor.Run ()
    
    IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this
    

2 个答案:

答案 0 :(得分:2)

如上所述here CAMERA权限是危险的,因此需要运行时权限。我建议你在启动应用程序后出现的第一个活动中写下该代码,以获得该许可。

import React, { Component } from 'react'
import { connect } from 'react-redux'

...
class MyComponent extends Component
  render() {
    return (
     <MainContainer withScroll>
       <GjeButton
         title="isMember?"
         onPress={() => { console.log(this.props.isMember) }} />
    )
  }
}

const mapState = (state) => ({
  isMember: state.current_user.member || false
})
export default connect(mapState)(YourComponent)

只需在onCreate中调用此方法:

private void VerifyPermission(){
   int permissionWriteExternalStorage = ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA);

    if(permissionWriteExternalStorage != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(YourActivityName.this, STORAGE_PERMISSIONS, 1);
    }
}

请记住,我发布的方法非常简单,可以稍后升级。

答案 1 :(得分:1)

首先,无论您支持哪种级别,都需要在AndroidManifest中添加此内容

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

除此之外,对于API级别23及更高级别,您需要明确请求用户权限。

并回答您的第一个问题:AndroidManifest会自动加载,因此您不必做任何特别的事情。

希望这会有所帮助!!