【问题标题】:Access denied for property "vendor.camera.aux.packagelist"拒绝访问属性“vendor.camera.aux.packagelist”
【发布时间】:2019-09-23 04:59:04
【问题描述】:

应用程序运行,但是当我尝试使用相机时,只出现一个令人不安的灰色屏幕,并且日志选项卡给了我两个错误:

E/libc: Access denied finding property "vendor.camera.aux.packagelist"
        Access denied finding property "vendor.camera.aux.packagelist2"

AndroidManifest.xml

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

build.gradle (Module:app)

apply plugin: 'com.android.application'
android {
    compileSdkVersion 28
    defaultConfig {
        minSdkVersion 22
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
}

build.gradle(Project:camera)

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.0'
    }
}
allprojects {
    repositories {
        google()
        jcenter()

    }
}
task clean(type: Delete) {
    delete rootProject.buildDir
}

【问题讨论】:

  • 你有解决这个问题的办法吗?
  • 还没有...我尝试重新安装 Android Studio 和所有软件包,但没有任何改变@Umesh

标签: android camera android-camera


【解决方案1】:

首先,检查您的 Android 版本。如果它在 Android 6.0 及更高版本(API 级别 23+)上运行,那么您需要:

在应用清单中声明权限。确保在应用标签上方插入权限。

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

<application ...>
    ...
</application>

然后,请求用户在运行时批准每个权限

if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != 
PackageManager.PERMISSION_GRANTED) { 
ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.CAMERA}, 
50); }

【讨论】:

  • 请问if 声明在项目中的哪个位置?
  • @KarolinaHagegård 通常我们会在 Splash Activity 中这样做,在原生 Android 开发中请求权限时
  • 好的...好吧,我正在使用 Flutter,它似乎会自动执行此操作。至少在我的手机上,它不会在我需要之前请求许可。
【解决方案2】:

我的 android manifest 中有这个,它阻止了应用程序使用相机。

android:hardwareAccelerated="false"

删除它对我有帮助。

【讨论】:

    【解决方案3】:

    首先要检查是否是权限问题,到手机的应用管理器,找到你的程序名称,查看权限列表。看看是否允许使用摄像头。

    其次,打开“SurfaceView”所在布局的XML,检查“SurfaceView”节点是否具有“android:background”属性。如果它存在,则必须将其删除。不知道为什么从来没有提到过。

    <SurfaceView
            android:layout_width="0dp"
            android:layout_height="300dp" android:id="@+id/cameraPreview"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent" android:background="#3F51B5"/>
    

    注意上面sn-p中的“android:background”。 如果您看到它,请将其删除。

    第三,确保在“surfaceCreated”事件处理程序而不是其他任何地方启动相机。不能在“onViewCreated”中直接启动摄像头!

    示例代码以防万一:

    public void onViewCreated(@NonNull final View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    
        final CameraSource cameraSource = new CameraSource.Builder(getContext(), barcodeDetector)
                .setRequestedPreviewSize(640, 480)
                .setRequestedFps(10)
                .setAutoFocusEnabled(true).build();
    
        ((SurfaceView) view.findViewById(R.id.cameraPreview)).getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                if(ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA)
                        != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA}, 1);
                }
    
                try {
                    cameraSource.start(holder);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
    
            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                cameraSource.stop();
            }
        });
    }
    

    【讨论】:

      【解决方案4】:

      原因:FileNotFoundException open failed: XXXXXXX EPERM (Operation not permitted)

      添加所有权限还是报错,主要是Android系统的权限要求非常严格。

      建议改为:

      ContextWrapper cw = new ContextWrapper(getApplicationContext());
      File directory = cw.getExternalFilesDir(Environment.DIRECTORY_MUSIC);
      File file = new File(directory, "something" + ".MP3");
      
      public static String DIRECTORY_MUSIC = "Music";
      public static String DIRECTORY_ALARMS = "Alarms";
      public static String DIRECTORY_NOTIFICATIONS = "Notifications";
      public static String DIRECTORY_PICTURES = "Pictures";
      public static String DIRECTORY_MOVIES = "Movies";
      public static String DIRECTORY_DOWNLOADS = "Download";
      public static String DIRECTORY_DCIM = "DCIM";
      public static String DIRECTORY_DOCUMENTS = "Documents";
      

      【讨论】:

        【解决方案5】:

        如果您在项目中使用 firebase 插件,请将其删除。我正在使用相机无法打开的 firebase crashlytics。

        【讨论】:

          【解决方案6】:

          当我尝试打开相机时,我在控制台中也看到了同样的错误。但是,它不会引起任何其他副作用。

          我认为最好忽略此错误,除非它阻止应用程序运行。或限制任何功能。

          找到一个帖子here,声称通过添加解决问题

          <application>
          <uses-library android:name="org.apache.http.legacy" android:required="false"/>
          </application>
          

          但是,这在我的情况下不起作用。小米 Note 7 测试

          【讨论】:

            【解决方案7】:

            我在实现视频捕获选项时也遇到了同样的错误,在我的情况下,这是由于缺少存储和相机权限。

            使用以下代码解决

              if ((checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED))  {
                            Log.d(TAG, "No camera and storage permission");
                            requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_CODE);
                        }
            

            【讨论】:

              【解决方案8】:

              在我的情况下,您必须在 [https://developer.android.com/codelabs/camerax-getting-started#0][1]

              之后,像这样更改伴随对象。

              companion object {
                  private const val TAG = "CameraXBasic"
                  private const val FILENAME_FORMAT = "yyyy-MM-dd-HH-mm-ss-SSS"
                  private const val REQUEST_CODE_PERMISSIONS = 10
                  private val REQUIRED_PERMISSIONS = arrayOf(Manifest.permission.CAMERA)
              }
              

              不要忘记在 manifest.xml 中添加访问存储的权限

              【讨论】:

                猜你喜欢
                • 2019-08-16
                • 2020-05-28
                • 2019-12-16
                • 2017-02-15
                • 2020-03-31
                • 2019-08-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多