- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在学习有关在 Android 应用程序中使用相机的教程。我在模拟器和物理设备上运行调试时收到错误“权限拒绝:无法使用相机”。我在 list 文件中尝试了多种权限。似乎大多数遇到此错误的人都有错字、缺少权限或权限不在 list 中的正确位置。
这是我的 list 文件:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.karudo.dbzrealpowerup" >
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera2" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".DBZHome"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".DBZStartPowerUp"
android:label="@string/title_activity_dbzstart_power_up" >
</activity>
</application>
</manifest>
这是我的 Activity :
package com.example.karudo.dbzrealpowerup;
import android.app.Activity;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.os.Bundle;
import android.util.Size;
import android.view.Menu;
import android.view.MenuItem;
import android.view.TextureView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class DBZStartPowerUp extends Activity {
private Size mPreviewSize;
private String mCameraId;
private TextureView mTextureView;
private TextureView.SurfaceTextureListener mSurfaceTextureListener =
new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
setupCamera(width, height);
openCamera();
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
};
private CameraDevice mCameraDevice;
private CameraDevice.StateCallback mCameraDeviceStateCallback
= new CameraDevice.StateCallback() {
@Override
public void onOpened(CameraDevice camera) {
mCameraDevice = camera;
Toast.makeText(getApplicationContext(), "Camera Opened!", Toast.LENGTH_SHORT).show();
}
@Override
public void onDisconnected(CameraDevice camera) {
camera.close();
mCameraDevice = null;
}
@Override
public void onError(CameraDevice camera, int error) {
camera.close();
mCameraDevice = null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dbzstartpowerup);
mTextureView = (TextureView) findViewById(R.id.dbzCameraPreview);
}
@Override
public void onResume() {
super.onResume();
if(mTextureView.isAvailable()) {
} else {
mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_dbzstartpowerup, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
private void setupCamera(int width, int height) {
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
for(String cameraId : cameraManager.getCameraIdList()) {
CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
if (cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) ==
CameraCharacteristics.LENS_FACING_FRONT) {
continue;
}
StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
mPreviewSize = getPreferredPreviewSize(map.getOutputSizes(SurfaceTexture.class), width, height);
mCameraId = cameraId;
return;
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
private Size getPreferredPreviewSize(Size[] mapSizes, int width, int height) {
List<Size> collectorSizes = new ArrayList<>();
for(Size option : mapSizes) {
if(width > height) {
if(option.getWidth() > width &&
option.getHeight() > height) {
collectorSizes.add(option);
}
} else {
if(option.getWidth() > height &&
option.getHeight() > width) {
collectorSizes.add(option);
}
}
}
if(collectorSizes.size() > 0) {
return Collections.min(collectorSizes, new Comparator<Size>() {
@Override
public int compare(Size lhs, Size rhs) {
return Long.signum(lhs.getWidth() * lhs.getHeight() - rhs.getWidth() * rhs.getHeight());
}
});
}
return mapSizes[0];
}
private void openCamera() {
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}
还有我的 logcat 中的错误:
10-04 03:15:02.740 961-8780/? E/CameraService﹕ Permission Denial: can't use the camera pid=20601, uid=10059
10-04 03:15:02.741 20601-20601/com.example.karudo.dbzrealpowerup E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.karudo.dbzrealpowerup, PID: 20601
java.lang.SecurityException: Lacking privileges to access camera service
at android.hardware.camera2.utils.CameraBinderDecorator.throwOnError(CameraBinderDecorator.java:108)
at android.hardware.camera2.legacy.CameraDeviceUserShim.connectBinderShim(CameraDeviceUserShim.java:336)
at android.hardware.camera2.CameraManager.openCameraDeviceUserAsync(CameraManager.java:324)
at android.hardware.camera2.CameraManager.openCamera(CameraManager.java:454)
at com.example.karudo.dbzrealpowerup.DBZStartPowerUp.openCamera(DBZStartPowerUp.java:163)
at com.example.karudo.dbzrealpowerup.DBZStartPowerUp.access$100(DBZStartPowerUp.java:23)
at com.example.karudo.dbzrealpowerup.DBZStartPowerUp$1.onSurfaceTextureAvailable(DBZStartPowerUp.java:34)
at android.view.TextureView.getHardwareLayer(TextureView.java:368)
at android.view.View.updateDisplayListIfDirty(View.java:15151)
at android.view.View.draw(View.java:15948)
at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
at android.view.View.updateDisplayListIfDirty(View.java:15169)
at android.view.View.draw(View.java:15948)
at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
at android.view.View.updateDisplayListIfDirty(View.java:15169)
at android.view.View.draw(View.java:15948)
at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
at android.view.View.updateDisplayListIfDirty(View.java:15169)
at android.view.View.draw(View.java:15948)
at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
at android.view.View.draw(View.java:16181)
at com.android.internal.policy.PhoneWindow$DecorView.draw(PhoneWindow.java:2690)
at android.view.View.updateDisplayListIfDirty(View.java:15174)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2615)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2434)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
at android.view.Choreographer.doCallbacks(Choreographer.java:670)
at android.view.Choreographer.doFrame(Choreographer.java:606)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我是应用程序开发的新手,诚然我不擅长调试,但从我看到的其他人的文件(以及仅 4 个月前的教程)来看,我的 list 权限似乎是正确的。
谁能告诉我我做错了什么?
干杯,李.
更新:我通过调试发现它一到达这个方法就崩溃了...
private void openCamera() {
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
...特别是在它运行 try 语句时。
更新 2:如果我注释掉 try/catch 语句,应用程序不会崩溃,但不会出现预期的结果(即打印“Camera Opened!”)。有什么想法吗?
更新 3:抱歉,我刚刚意识到我上面的编辑是多么愚蠢。它不再崩溃的原因很明显,但至少我现在知道我必须调试我的 cameraManager.openCamera
参数。代码就在那里,如果有人可以看的话:)
最佳答案
如果您使用的是 Android 6 Marshmallow,则此问题可能是由新的权限管理引起的。就我而言,我通过覆盖以下 Activity 方法解决了问题:
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case CAMERA_PERMISSION:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if(mClss != null) {
Intent intent = new Intent(this, ClassUsingCamera);
startActivity(intent);
}
} else {
Toast.makeText(this, "Please grant camera permission to use the QR Scanner", Toast.LENGTH_SHORT).show();
}
return;
}
}
然后我使用以下代码启动了需要相机 (ClassUsingCamera) 的 Activity :
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION);
} else {
Intent intent = new Intent(this, ClassUsingCamera);
startActivity(intent);
}
在第一次启动应用程序时,您会看到一个弹出窗口,要求您授予对相机的访问权限。
另一种选择是使用此处解释的 PermissionsDispatcher https://github.com/hotchemi/PermissionsDispatcher
关于Android "Permission Denial: can' t 使用相机”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32929790/
因此,这更像是关于防止 DoS 攻击的最佳实践的一般性问题,我只是想了解大多数人如何处理来自同一 IP 地址的恶意请求,这是我们目前遇到的问题。 我认为最好尽可能高地阻止真正恶意 IP 的 IP,以防
我正在使用sound_stream包从麦克风获取流,并将其发送到Google Speech To Text Api。当我尝试使用简单的屏幕(如仅一个按钮)来开始收听和获取转录时,它工作正常。我可以立即
我的 Android 应用程序存在权限问题:这里是日志。 06-25 17:25:35.862 12039-13799/? E/DatabaseUtils﹕ Writing exception to
用于运行的应用程序。然而,就在最近它开始停止工作。该设备运行的是 Android Nutella。下面是 LogCat。 java.lang.SecurityException: Permissio
我正在尝试编写一个简单的 android 应用程序来关闭我的手机屏幕。当我运行这个应用程序时,我得到安全异常:权限拒绝应用程序需要 android.permission.DEVICE_POWER。我知
我正在尝试使用 DownloadManager 下载文件。是的,我知道人们已经遇到了这个错误。但我的似乎没有解决。我每次都试过了。 我已经取消了这个权限: 我的代码 public void st
我设置了一个 ContentProvider,仅供我的应用内部使用,用流响应 URI,我通过该流构建并提供一个 zip 文件。 Uri 作为额外的 (Intent.EXTRA_STREAM) 传递给
我点击我的 AdView 并在 Play 商店中打开 alibaba app 页面,然后安装它。之后,我开始收到此错误,每当我点击 AdView 时,我的应用程序就会崩溃。卸载这个阿里巴巴应用程序后,
我刚刚升级到新版本的 gmail (v2.3.5),我有一个应用程序可以查询内容提供者以获取有关接收消息的联系人的详细信息...... 对于最新版本,我收到以下错误: java.lang.Securi
我的构建被破坏了,因为 yarn audit说我的依赖项存在漏洞: yarn audit yarn audit v1.22.5 ┌───────────────┬───────────────────
我成功地让这些 c2dm 实现在我的应用程序上运行。 当设备突然没有收到 c2dm 消息时,我遇到了一个问题。这次它拒绝了我的许可,我对此感到困惑: Permission Denial: receiv
不幸的是,当我尝试运行我的墙纸时,我收到一条错误消息,提示 Permission Denial starting Intent 并且需要 android.permission.BIND_WALLPAP
我是 android 开发的新手。在我的应用程序中,我有一个显示在 ListView 中的联系人类。对于我的联系人,我有一张从图库中获得的图像,图像 uri 存储在数据库中。在我最后Post 我的问题
我正在学习有关在 Android 应用程序中使用相机的教程。我在模拟器和物理设备上运行调试时收到错误“权限拒绝:无法使用相机”。我在 list 文件中尝试了多种权限。似乎大多数遇到此错误的人都有错字、
我的程序一直运行良好,但我想我一定是不小心更改了一些我不应该做的事情。我让我的程序在按下按钮时运行“UpdateService”,但现在它不运行,并且调试显示以下两行: 01-05 21:43:39.
我有以下问题。我们创建了一个游戏中心应用程序,它提供了一个框架来创建临时 wifi 游戏并管理此类游戏的高分/遭遇。 高分的数据库访问是通过提供者完成的: 我们的演示游戏(作为 future 游戏
我在 Oreo Android 8.0/8.1 设备上使用日历提供程序时遇到应用程序崩溃问题。在运行 Nougat 及以下版本的我的设备上未显示该问题。 Permission Denial: read
我的应用中有两个 Activity ,MainActivity 调用 ImagePicker,它有一个 GridView 布局手机图库中的所有图像,我使用 ContentResolver 来获取光标。
背景 我有一个根设备,它是 Galaxy S3 I9300,带有基于三星股票的 ROM,基于 Android 4.3。 我在使用此设备上运行的应用程序从未遇到任何问题。 问题 从昨天开始(并且我没有在
我目前正在调整我的应用以适应 Android 11。当我想共享文件时,我在 logcat 中收到以下错误消息: Permission Denial: reading androidx.core.con
我是一名优秀的程序员,十分优秀!