属性“vendor.camera.aux.packagelist”的访问被拒绝

问题描述 投票:0回答:9

应用程序运行,但当我尝试使用相机时,只会出现一个受干扰的灰色屏幕,并且日志选项卡给我两个错误:

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(模块:应用程序)

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(项目:相机)

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 camera android-camera
9个回答
8
投票

首先,检查您的 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); }

3
投票

我的 Android 清单中有此内容,阻止应用程序使用相机。

android:hardwareAccelerated="false"

删除它对我有帮助。


1
投票

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

其次,打开“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"/>

注意上面代码片段中的“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();
        }
    });
}

1
投票

原因:

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";

0
投票

如果您的项目中使用了 Firebase 插件,请将其删除。我正在使用 firebase crashlytics,相机会阻止打开。


0
投票

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

使用下面的代码解决了

  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);
            }

0
投票

就我而言,您必须在此处遵循 Android jetpack 的相机课程 [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中添加访问存储的权限


0
投票

就我而言,问题的原因是在ui尚未准备好之前surfaceTexture就可用了。为了解决这个问题,我添加了一些延迟(我不知道这是否是正确的解决方案,但它有效)。

@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int arg1, int arg2) {
    mSurfaceTexture = surfaceTexture;
    try {
        Thread.sleep(200); // add some delay
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    cameraHelper.openCamera(mSurfaceTexture);
}

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.