属性 "vendor.camera.aux.packagelist" 的访问被拒绝
Access denied for property "vendor.camera.aux.packagelist"
应用程序运行,但当我尝试使用相机时,只出现灰色屏幕,日志选项卡给我两个错误:
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 版本。如果它在 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); }
我的 android 清单中有这个阻止应用程序使用相机。
android:hardwareAccelerated="false"
删除它对我很有帮助。
如果您在项目中使用 firebase 插件,请将其删除。我正在使用相机阻止打开的 firebase crashlytics。
当我尝试打开相机时,我的控制台也出现了同样的错误。但是,它不会引起任何其他副作用。
我认为最好忽略此错误,除非它从 运行 停止应用程序。或限制任何功能。
找到一个声称可以通过添加
来解决问题的 post here
<application>
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
</application>
但是,这对我来说不起作用。在 Mi Note 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);
}
首先,要检查是否是权限问题,请转到phone的应用程序管理器,找到您的程序名称,然后检查权限列表。查看是否允许使用相机。
其次,打开你的“SurfaceView”所在布局的XML,检查“SurfaceView”节点是否有属性 android:背景”。如果它存在,您必须将其删除。不知道为什么从来没有提到过。
<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();
}
});
}
原因: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";
就我而言,您必须在此处 [https://developer.android.com/codelabs/camerax-getting-started#0][1][= 跟随 android 喷气背包参加相机课程11=]
之后,像这样更改伴随对象。
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
中添加访问存储的权限
应用程序运行,但当我尝试使用相机时,只出现灰色屏幕,日志选项卡给我两个错误:
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 版本。如果它在 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); }
我的 android 清单中有这个阻止应用程序使用相机。
android:hardwareAccelerated="false"
删除它对我很有帮助。
如果您在项目中使用 firebase 插件,请将其删除。我正在使用相机阻止打开的 firebase crashlytics。
当我尝试打开相机时,我的控制台也出现了同样的错误。但是,它不会引起任何其他副作用。
我认为最好忽略此错误,除非它从 运行 停止应用程序。或限制任何功能。
找到一个声称可以通过添加
来解决问题的 post here<application>
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
</application>
但是,这对我来说不起作用。在 Mi Note 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);
}
首先,要检查是否是权限问题,请转到phone的应用程序管理器,找到您的程序名称,然后检查权限列表。查看是否允许使用相机。
其次,打开你的“SurfaceView”所在布局的XML,检查“SurfaceView”节点是否有属性 android:背景”。如果它存在,您必须将其删除。不知道为什么从来没有提到过。
<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();
}
});
}
原因: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";
就我而言,您必须在此处 [https://developer.android.com/codelabs/camerax-getting-started#0][1][= 跟随 android 喷气背包参加相机课程11=]
之后,像这样更改伴随对象。
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
中添加访问存储的权限