#java #android #camera #android_camera
Я работаю с Camera2API и использую для этого гугловский пример который на гите Мистика вот в этом методе который и открывает камеру private void openCamera(int width, int height) { setUpCameraOutputs(width, height); configureTransform(width, height); CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) { throw new RuntimeException("Time out waiting to lock camera opening."); } if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { return; } manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } catch (InterruptedException e) { throw new RuntimeException("Interrupted while trying to lock camera opening.", e); } } Сейчас использую Samsung S6 android 6.0 Ожидается, что метод manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler); - откроет камеру, но вместо это код останавливается в if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { return; } насколько я понимаю, он не проходит проверку на permission, я проверил в манифесте это и там есть нужный permissionЧто это может означать? Потом я попробовал открыть камеру на Meizu MX5 android 5.1 и все открывается и правильно работает Может ли проблема быть в версиях андроида? Что я делаю не так? Как это можно проверить?
Ответы
Ответ 1
В android 6.0 изменились правила запроса разрешений теперь нужно запрашивать разрешения, а не просто прописать в manifest. Ссылка на документацию от googleОтвет 2
В итоге вот так все заработало, почитал офф статью и там действительно много изменений для 6-ки (кстати мне понравилось как все описано здесь), ну в общем согласно все нововедений собралось вот такое решение С формой реализации диалога запроса если ранее в пермишене было отказано public void camera(View view) { toCamera(); } private void toCamera() { if (!isCheckPermission()){ return; } if (isProcessWasFinish()) { startActivity(new Intent(getApplicationContext(), CameraActivity.class)); overridePendingTransition(R.anim.open_next, R.anim.close_main); } else { startActivity(new Intent(getApplicationContext(), UserDataScreen.class)); overridePendingTransition(R.anim.open_next, R.anim.close_main); } } private boolean isCheckPermission() { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { showMessageOKCancel("You need to allow access to Camera"); return false; } // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST); return false; // MY_PERMISSIONS_REQUEST is an // app-defined int constant. The callback method gets the // result of the request. } return true; } private void showMessageOKCancel(String message) { new AlertDialog.Builder(MainActivity.this) .setMessage(message) .setPositiveButton("OK", listener) .setNegativeButton("Cancel", listener) .create() .show(); } DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { final int BUTTON_NEGATIVE = -2; final int BUTTON_POSITIVE = -1; @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case BUTTON_NEGATIVE: // int which = -2 dialog.dismiss(); break; case BUTTON_POSITIVE: // int which = -1 ActivityCompat.requestPermissions( MainActivity.this, new String[]{android.Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST); dialog.dismiss(); break; } } }; @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.e(MY_LOG, "Camera permission Granted"); // permission was granted, yay! Do the // contacts-related task you need to do. toCamera(); } else { Log.e(MY_LOG, "Camera permission Denied"); // permission denied, boo! Disable the // functionality that depends on this permission. } } default: { super.onRequestPermissionsResult(requestCode, permissions, grantResults); } // other 'case' lines to check for other // permissions this app might request } }Ответ 3
То, что вы разобрались, это очень хорошо. Но руками каждый раз проверять и запрашивать permission очень неудобно. Используйте готовые решения https://github.com/Karumi/DexterОтвет 4
http://easyrobot.online/temp/permission6.jar if(!AccessPermission.getPermmission(this)){ AccessPermission.setOnPermmissionResult(new OnPermmissionResult() { @Override public void OnPermmission(boolean access, String[] permissions, int[] grantResults) { if(access)init(); } }); }else init(); - в манифест
Комментариев нет:
Отправить комментарий