1ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirpackage com.android.camera; 2ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 3ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport android.Manifest; 4ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport android.app.Activity; 5dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.app.Dialog; 6ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport android.app.AlertDialog; 7dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.app.KeyguardManager; 8dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.content.BroadcastReceiver; 9dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.content.Context; 10ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport android.content.DialogInterface; 11dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.content.Intent; 12dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.content.IntentFilter; 13ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport android.content.pm.PackageManager; 14ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport android.os.Bundle; 15dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.view.KeyEvent; 16dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.view.Window; 17dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.view.WindowManager; 18ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport com.android.camera.app.CameraServicesImpl; 19ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport com.android.camera.debug.Log; 20ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport com.android.camera.settings.Keys; 21ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport com.android.camera.settings.SettingsManager; 22dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport com.android.camera.util.QuickActivity; 23ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport com.android.camera2.R; 24ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 25ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir/** 26ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir * Activity that shows permissions request dialogs and handles lack of critical permissions. 27ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir */ 28dd334be92c5513a06c809ee3ea25e411dfad0589zafirpublic class PermissionsActivity extends QuickActivity { 29ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private static final Log.Tag TAG = new Log.Tag("PermissionsActivity"); 30ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 31ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private static int PERMISSION_REQUEST_CODE = 1; 32148d0b8e3fd412fa6a666e75484fe6b7e0465f5azafir private static int RESULT_CODE_OK = 1; 33148d0b8e3fd412fa6a666e75484fe6b7e0465f5azafir private static int RESULT_CODE_FAILED = 2; 34ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 35ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private int mIndexPermissionRequestCamera; 36ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private int mIndexPermissionRequestMicrophone; 37ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private int mIndexPermissionRequestLocation; 38ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private int mIndexPermissionRequestStorage; 39ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private boolean mShouldRequestCameraPermission; 40ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private boolean mShouldRequestMicrophonePermission; 41ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private boolean mShouldRequestLocationPermission; 42ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private boolean mShouldRequestStoragePermission; 43ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private int mNumPermissionsToRequest; 44ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private boolean mFlagHasCameraPermission; 45ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private boolean mFlagHasMicrophonePermission; 46ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private boolean mFlagHasStoragePermission; 47ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private SettingsManager mSettingsManager; 48ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 49dd334be92c5513a06c809ee3ea25e411dfad0589zafir /** 50dd334be92c5513a06c809ee3ea25e411dfad0589zafir * Close activity when secure app passes lock screen or screen turns 51dd334be92c5513a06c809ee3ea25e411dfad0589zafir * off. 52dd334be92c5513a06c809ee3ea25e411dfad0589zafir */ 53dd334be92c5513a06c809ee3ea25e411dfad0589zafir private final BroadcastReceiver mShutdownReceiver = new BroadcastReceiver() { 54dd334be92c5513a06c809ee3ea25e411dfad0589zafir @Override 55dd334be92c5513a06c809ee3ea25e411dfad0589zafir public void onReceive(Context context, Intent intent) { 56dd334be92c5513a06c809ee3ea25e411dfad0589zafir Log.v(TAG, "received intent, finishing: " + intent.getAction()); 57dd334be92c5513a06c809ee3ea25e411dfad0589zafir finish(); 58dd334be92c5513a06c809ee3ea25e411dfad0589zafir } 59dd334be92c5513a06c809ee3ea25e411dfad0589zafir }; 60dd334be92c5513a06c809ee3ea25e411dfad0589zafir 61ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir @Override 62dd334be92c5513a06c809ee3ea25e411dfad0589zafir protected void onCreateTasks(Bundle savedInstanceState) { 63dd334be92c5513a06c809ee3ea25e411dfad0589zafir setContentView(R.layout.permissions); 64ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mSettingsManager = CameraServicesImpl.instance().getSettingsManager(); 65dd334be92c5513a06c809ee3ea25e411dfad0589zafir 66dd334be92c5513a06c809ee3ea25e411dfad0589zafir // Filter for screen off so that we can finish permissions activity 67dd334be92c5513a06c809ee3ea25e411dfad0589zafir // when screen is off. 68dd334be92c5513a06c809ee3ea25e411dfad0589zafir IntentFilter filter_screen_off = new IntentFilter(Intent.ACTION_SCREEN_OFF); 69dd334be92c5513a06c809ee3ea25e411dfad0589zafir registerReceiver(mShutdownReceiver, filter_screen_off); 70dd334be92c5513a06c809ee3ea25e411dfad0589zafir 71dd334be92c5513a06c809ee3ea25e411dfad0589zafir // Filter for phone unlock so that we can finish permissions activity 72dd334be92c5513a06c809ee3ea25e411dfad0589zafir // via this UI path: 73dd334be92c5513a06c809ee3ea25e411dfad0589zafir // 1. from secure lock screen, user starts secure camera 74dd334be92c5513a06c809ee3ea25e411dfad0589zafir // 2. user presses home button 75dd334be92c5513a06c809ee3ea25e411dfad0589zafir // 3. user unlocks phone 76dd334be92c5513a06c809ee3ea25e411dfad0589zafir IntentFilter filter_user_unlock = new IntentFilter(Intent.ACTION_USER_PRESENT); 77dd334be92c5513a06c809ee3ea25e411dfad0589zafir registerReceiver(mShutdownReceiver, filter_user_unlock); 78dd334be92c5513a06c809ee3ea25e411dfad0589zafir 79dd334be92c5513a06c809ee3ea25e411dfad0589zafir Window win = getWindow(); 80dd334be92c5513a06c809ee3ea25e411dfad0589zafir if (isKeyguardLocked()) { 81dd334be92c5513a06c809ee3ea25e411dfad0589zafir win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 82dd334be92c5513a06c809ee3ea25e411dfad0589zafir } else { 83dd334be92c5513a06c809ee3ea25e411dfad0589zafir win.clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 84dd334be92c5513a06c809ee3ea25e411dfad0589zafir } 85ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 86ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 87ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir @Override 88dd334be92c5513a06c809ee3ea25e411dfad0589zafir protected void onResumeTasks() { 89ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mNumPermissionsToRequest = 0; 90ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir checkPermissions(); 91ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 92ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 93dd334be92c5513a06c809ee3ea25e411dfad0589zafir @Override 94dd334be92c5513a06c809ee3ea25e411dfad0589zafir protected void onDestroyTasks() { 95dd334be92c5513a06c809ee3ea25e411dfad0589zafir Log.v(TAG, "onDestroy: unregistering receivers"); 96dd334be92c5513a06c809ee3ea25e411dfad0589zafir unregisterReceiver(mShutdownReceiver); 97dd334be92c5513a06c809ee3ea25e411dfad0589zafir } 98dd334be92c5513a06c809ee3ea25e411dfad0589zafir 99ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private void checkPermissions() { 100ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir if (checkSelfPermission(Manifest.permission.CAMERA) 101ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir != PackageManager.PERMISSION_GRANTED) { 102ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mNumPermissionsToRequest++; 103ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mShouldRequestCameraPermission = true; 104ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } else { 105ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mFlagHasCameraPermission = true; 106ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 107ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 108ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir if (checkSelfPermission(Manifest.permission.RECORD_AUDIO) 109ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir != PackageManager.PERMISSION_GRANTED) { 110ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mNumPermissionsToRequest++; 111ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mShouldRequestMicrophonePermission = true; 112ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } else { 113ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mFlagHasMicrophonePermission = true; 114ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 115ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 116ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) 117ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir != PackageManager.PERMISSION_GRANTED) { 118ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mNumPermissionsToRequest++; 119ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mShouldRequestStoragePermission = true; 120ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } else { 121ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mFlagHasStoragePermission = true; 122ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 123ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 124ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) 125ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir != PackageManager.PERMISSION_GRANTED) { 126ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mNumPermissionsToRequest++; 127ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mShouldRequestLocationPermission = true; 128ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 129ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 130ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir if (mNumPermissionsToRequest != 0) { 131dd334be92c5513a06c809ee3ea25e411dfad0589zafir if (!isKeyguardLocked() && !mSettingsManager.getBoolean(SettingsManager.SCOPE_GLOBAL, 132ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir Keys.KEY_HAS_SEEN_PERMISSIONS_DIALOGS)) { 133ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir buildPermissionsRequest(); 134ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } else { 135dd334be92c5513a06c809ee3ea25e411dfad0589zafir // Permissions dialog has already been shown, or we're on 136dd334be92c5513a06c809ee3ea25e411dfad0589zafir // lockscreen, and we're still missing permissions. 137ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir handlePermissionsFailure(); 138ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 139ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } else { 140ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir handlePermissionsSuccess(); 141ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 142ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 143ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 144ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private void buildPermissionsRequest() { 145ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir String[] permissionsToRequest = new String[mNumPermissionsToRequest]; 146ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir int permissionsRequestIndex = 0; 147ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 148ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir if (mShouldRequestCameraPermission) { 149ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir permissionsToRequest[permissionsRequestIndex] = Manifest.permission.CAMERA; 150ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mIndexPermissionRequestCamera = permissionsRequestIndex; 151ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir permissionsRequestIndex++; 152ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 153ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir if (mShouldRequestMicrophonePermission) { 154ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir permissionsToRequest[permissionsRequestIndex] = Manifest.permission.RECORD_AUDIO; 155ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mIndexPermissionRequestMicrophone = permissionsRequestIndex; 156ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir permissionsRequestIndex++; 157ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 158ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir if (mShouldRequestStoragePermission) { 159ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir permissionsToRequest[permissionsRequestIndex] = Manifest.permission.READ_EXTERNAL_STORAGE; 160ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mIndexPermissionRequestStorage = permissionsRequestIndex; 161ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir permissionsRequestIndex++; 162ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 163ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir if (mShouldRequestLocationPermission) { 164ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir permissionsToRequest[permissionsRequestIndex] = Manifest.permission.ACCESS_COARSE_LOCATION; 165ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mIndexPermissionRequestLocation = permissionsRequestIndex; 166ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 167ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 168dd334be92c5513a06c809ee3ea25e411dfad0589zafir Log.v(TAG, "requestPermissions count: " + permissionsToRequest.length); 169ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir requestPermissions(permissionsToRequest, PERMISSION_REQUEST_CODE); 170ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 171ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 172ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir @Override 173ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir public void onRequestPermissionsResult(int requestCode, 174ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir String permissions[], int[] grantResults) { 175dd334be92c5513a06c809ee3ea25e411dfad0589zafir Log.v(TAG, "onPermissionsResult counts: " + permissions.length + ":" + grantResults.length); 176ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mSettingsManager.set( 177ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir SettingsManager.SCOPE_GLOBAL, 178ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir Keys.KEY_HAS_SEEN_PERMISSIONS_DIALOGS, 179ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir true); 180ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 181ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir if (mShouldRequestCameraPermission) { 182c8594ddf504109dc3c17baf9c2448469b28973e9Alan Newberger if (grantResults.length > 0 && grantResults[mIndexPermissionRequestCamera] == 183c8594ddf504109dc3c17baf9c2448469b28973e9Alan Newberger PackageManager.PERMISSION_GRANTED) { 184ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mFlagHasCameraPermission = true; 185ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } else { 186ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir handlePermissionsFailure(); 187ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 188ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 189ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir if (mShouldRequestMicrophonePermission) { 190c8594ddf504109dc3c17baf9c2448469b28973e9Alan Newberger if (grantResults.length > 0 && grantResults[mIndexPermissionRequestMicrophone] == 191c8594ddf504109dc3c17baf9c2448469b28973e9Alan Newberger PackageManager.PERMISSION_GRANTED) { 192ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mFlagHasMicrophonePermission = true; 193ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } else { 194ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir handlePermissionsFailure(); 195ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 196ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 197ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir if (mShouldRequestStoragePermission) { 198c8594ddf504109dc3c17baf9c2448469b28973e9Alan Newberger if (grantResults.length > 0 && grantResults[mIndexPermissionRequestStorage] == 199c8594ddf504109dc3c17baf9c2448469b28973e9Alan Newberger PackageManager.PERMISSION_GRANTED) { 200ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir mFlagHasStoragePermission = true; 201ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } else { 202ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir handlePermissionsFailure(); 203ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 204ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 205ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 206ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir if (mShouldRequestLocationPermission) { 207c8594ddf504109dc3c17baf9c2448469b28973e9Alan Newberger if (grantResults.length > 0 && grantResults[mIndexPermissionRequestLocation] == 208c8594ddf504109dc3c17baf9c2448469b28973e9Alan Newberger PackageManager.PERMISSION_GRANTED) { 209ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir // Do nothing 210ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } else { 211ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir // Do nothing 212ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 213ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 214ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 215ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir if (mFlagHasCameraPermission && mFlagHasMicrophonePermission && mFlagHasStoragePermission) { 216ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir handlePermissionsSuccess(); 217ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 218ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 219ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 220ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private void handlePermissionsSuccess() { 221ac0e2425e77a9b69e76d2f31876798825ea44584zafir Intent intent = new Intent(this, CameraActivity.class); 222ac0e2425e77a9b69e76d2f31876798825ea44584zafir startActivity(intent); 223ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir finish(); 224ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 225ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir 226ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir private void handlePermissionsFailure() { 227ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir new AlertDialog.Builder(this).setTitle(getResources().getString(R.string.camera_error_title)) 228ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir .setMessage(getResources().getString(R.string.error_permissions)) 229dd334be92c5513a06c809ee3ea25e411dfad0589zafir .setCancelable(false) 230dd334be92c5513a06c809ee3ea25e411dfad0589zafir .setOnKeyListener(new Dialog.OnKeyListener() { 231dd334be92c5513a06c809ee3ea25e411dfad0589zafir @Override 232dd334be92c5513a06c809ee3ea25e411dfad0589zafir public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 233dd334be92c5513a06c809ee3ea25e411dfad0589zafir if (keyCode == KeyEvent.KEYCODE_BACK) { 234dd334be92c5513a06c809ee3ea25e411dfad0589zafir finish(); 235dd334be92c5513a06c809ee3ea25e411dfad0589zafir } 236dd334be92c5513a06c809ee3ea25e411dfad0589zafir return true; 237dd334be92c5513a06c809ee3ea25e411dfad0589zafir } 238dd334be92c5513a06c809ee3ea25e411dfad0589zafir }) 239dd334be92c5513a06c809ee3ea25e411dfad0589zafir .setPositiveButton(getResources().getString(R.string.dialog_dismiss), 240dd334be92c5513a06c809ee3ea25e411dfad0589zafir new DialogInterface.OnClickListener() { 241ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir @Override 242ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir public void onClick(DialogInterface dialog, int which) { 243ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir finish(); 244ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 245ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir }) 246ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir .show(); 247ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir } 248ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir} 249