我正在使用Android M 6.0.1在我的Nexus 5上調試我的應用程序,並且出現相機權限問題。在我的應用程序需要打開相機的按鈕被點擊時,卻引發我此異常:java.lang.SecurityException:權限拒絕:IMAGE_CAPTURE開始意圖
04-06 14:03:25.213 15330-15330/clyky.cartracker W/System.err: java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=com.google.android.GoogleCamera/com.android.camera.activity.CaptureActivity clip={text/uri-list U:file:///storage/emulated/0/TesseractSample/imgs/ocr.jpg} (has extras) } from ProcessRecord{50bae23 15330:clyky.cartracker/u0a117} (pid=15330, uid=10117) with revoked permission android.permission.CAMERA
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at android.os.Parcel.readException(Parcel.java:1666)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at android.os.Parcel.readException(Parcel.java:1619)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2658)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at android.app.Instrumentation.execStartActivity(Instrumentation.java:1507)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at android.app.Activity.startActivityForResult(Activity.java:3930)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at android.app.Activity.startActivityForResult(Activity.java:3890)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at clyky.cartracker.activities.AddVehicleActivity.startCameraActivity(AddVehicleActivity.java:99)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at clyky.cartracker.activities.AddVehicleActivity.access$000(AddVehicleActivity.java:35)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at clyky.cartracker.activities.AddVehicleActivity$1.onClick(AddVehicleActivity.java:66)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at android.view.View.performClick(View.java:5204)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at android.view.View$PerformClick.run(View.java:21156)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at android.os.Looper.loop(Looper.java:148)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5458)
04-06 14:03:25.226 15330-15330/clyky.cartracker W/System.err: at java.lang.reflect.Method.invoke(Native Method)
04-06 14:03:25.227 15330-15330/clyky.cartracker W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
04-06 14:03:25.227 15330-15330/clyky.cartracker W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我已經添加了讀許可/寫外部文件夾和相機我的清單:
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
這是我嘗試啓動相機的方法:
private void startCameraActivity()
{
try
{
Log.d("debug", "sto provando a lanciare la fotocamera");
String IMGS_PATH = Environment.getExternalStorageDirectory().toString() + "/TesseractSample/imgs";
prepareDirectory(IMGS_PATH);
String img_path = IMGS_PATH + "/ocr.jpg";
outputFileUri = Uri.fromFile(new File(img_path));
final Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, PHOTO_REQUEST_CODE);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
我認爲問題是,要求攝像機的權限從未顯示。當我的活動啓動時,它會要求我讀取/寫入外部存儲器,但絕對不能用於相機。 我已經採取了網絡上的權限的代碼。它使用這個類:
public class RequestPermissionsToolToolImpl implements RequestPermissionsTool
{
private static final String CONFIRMATION_DIALOG = "ConfirmationDialog";
private static final String TAG = RequestPermissionsToolToolImpl.class.getSimpleName();
private Activity activity;
@Override
public void requestPermissions(Activity activity, String[] permissions)
{
Log.d("debug", "sto chiedendo i permessi.");
int x = 0;
Map<Integer, String> permissionsMap = new HashMap<>();
this.activity = activity;
for (int i = 0; i < permissions.length; i++) {
permissionsMap.put(i, permissions[i]);
}
for (Map.Entry<Integer, String> permission : permissionsMap.entrySet())
{
if (!isPermissionGranted(activity, permission.getValue()))
{
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission.getValue()))
{
ConfirmationDialog.newInstance(permission.getKey(), permission.getValue()).show(activity.getFragmentManager(), CONFIRMATION_DIALOG);
}
else {
ActivityCompat.requestPermissions(activity, permissions,
permission.getKey());
return;
}
}
}
}
@Override
public boolean isPermissionsGranted(Context context, String[] permissions) {
for (String permission : permissions)
{
if (!isPermissionGranted(context, permission)) {
return false;
}
}
return true;
}
@Override
public void onPermissionDenied() {
ErrorDialog.newInstance("Permission needs").
show(activity.getFragmentManager(), CONFIRMATION_DIALOG);
}
private boolean isPermissionGranted(Context context, String permission)
{
return ActivityCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;
}
/**
* Shows OK/Cancel confirmation dialog about permission.
*/
public static class ConfirmationDialog extends DialogFragment
{
private static final String ARG_PERMISSION = "permission";
private static final String ARG_REQUEST_CODE = "request_code";
public static ConfirmationDialog newInstance(int permissionKey, String permissionValue) {
ConfirmationDialog dialog = new ConfirmationDialog();
Bundle bundle = new Bundle();
bundle.putString(ARG_PERMISSION, permissionValue);
bundle.putInt(ARG_REQUEST_CODE, permissionKey);
dialog.setArguments(bundle);
return dialog;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setMessage("Please allow permission")
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(getActivity(),
new String[]{getArguments().getString(ARG_PERMISSION)},
getArguments().getInt(ARG_REQUEST_CODE));
}
})
.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getActivity(), "Not available", Toast.LENGTH_SHORT).show();
}
})
.create();
}
}
/**
* Shows an error message dialog.
*/
public static class ErrorDialog extends DialogFragment {
private static final String ARG_MESSAGE = "message";
public static ErrorDialog newInstance(String message) {
ErrorDialog dialog = new ErrorDialog();
Bundle args = new Bundle();
args.putString(ARG_MESSAGE, message);
dialog.setArguments(args);
return dialog;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Activity activity = getActivity();
return new AlertDialog.Builder(activity)
.setMessage(getArguments().getString(ARG_MESSAGE))
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//nothing
}
})
.create();
}
}
}
,這些都是在我的活性的方法,它使用權限:
private void requestPermissions()
{
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
requestTool = new RequestPermissionsToolToolImpl();
requestTool.requestPermissions(this, permissions);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
boolean grantedAllPermissions = true;
for (int grantResult : grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
grantedAllPermissions = false;
}
}
if (grantResults.length != permissions.length || (!grantedAllPermissions)) {
requestTool.onPermissionDenied();
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
試試這個[輸入鏈接描述](http://stackoverflow.com/questions/32789027/android-m-camera-intent-permission-bug) –
@Alexander Palshyn非常感謝你,我已經刪除了相機許可的聲明在我的清單,現在它的作品。 我完全沒有意識到Google相機沒有聲明相機權限。 – Clyky