2016-08-02 4 views
0

У меня проблемы с обработкой разрешений времени выполнения в Android Marshmallow, и мне действительно нужна рука. Проблема в том, что когда я отказываюсь от разрешения во время выполнения (когда диалог появляется), приложение выходит из строя. Более подробно, активность, которую я запускаю в данный момент, перезапускается (я просто называю это крахом приложения?).Отказ от разрешения Runtime в Android Marshmallow Crashes App

Вот код:

public void showContacts() { 

    if (CommonData.showLogs) { 
     Log.d(debugTag, "Show contacts button pressed. Checking permissions."); 
    } 

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) 
      != PackageManager.PERMISSION_GRANTED 
      || ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS) 
      != PackageManager.PERMISSION_GRANTED) { 

     requestContactsPermissions(); 
    } else { 

     if (CommonData.showLogs) { 
      Log.d(debugTag, "Contact permissions have already been granted. Displaying contact details."); 
     } 

     // Do my Stuff 
    } 
} 

private void requestContactsPermissions() { 

    if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
      Manifest.permission.READ_CONTACTS) 
      || ActivityCompat.shouldShowRequestPermissionRationale(this, 
      Manifest.permission.WRITE_CONTACTS)) { 

     Snackbar.make(rLParent, R.string.permission_contacts_rationale, 
       Snackbar.LENGTH_INDEFINITE) 
       .setAction(R.string.ok, new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 

         ActivityCompat 
           .requestPermissions(ImportContactsActivity.this, PERMISSIONS_CONTACT, 
             REQUEST_CONTACTS); 
        } 
       }) 
       .show(); 
    } else { 

     ActivityCompat.requestPermissions(ImportContactsActivity.this, PERMISSIONS_CONTACT, REQUEST_CONTACTS); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 


    if (requestCode == REQUEST_CONTACTS) { 

     if (PermissionUtil.verifyPermissions(grantResults)) { 

      // Do my Stuff 
     } else { 



      Snackbar.make(rLParent, R.string.permissions_not_granted, 
        Snackbar.LENGTH_SHORT) 
        .show(); 

     } 

    } else { 
     Log.d(debugTag, "Contacts permissions were NOT granted."); 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 

} 

Что я здесь делаю неправильно? Любая помощь будет принята с благодарностью. Большое спасибо!

+0

Просьба сообщить о своем отчете о сбое в LogCat. Легче определить проблему таким образом. –

+0

Нет отчета о сбоях в регистрации logcat. Он сразу же перезапустит действие. –

+0

да, это необработанное исключение. Обычно андроид пытается начать свою деятельность сразу же после сбоя ... В развертывании я бы предложил вам развернуть механизм сообщений о сбоях, например, crashlytics для обработки сбоев на пользовательских устройствах. – Kushan

ответ

1

Попробуйте выполнить действия, выполненные с использованием Разрешения внутри блока Try-catch, и отобразить сообщение или что-то, когда возникает исключение SecurityException.

Например ... Я использовал следующее для разрешений Location После запроса разрешения ...

ErrorText является TextView отображается в центре экрана, чтобы показать, что пользователь должен сделать ...

  try { 

       LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 


      }catch (SecurityException se){ 
       Log.d("FragmentCreate","You don't have permissions"); 

       errortext.setVisibility(View.VISIBLE); 
       errortext.setText("Please provide Location permission to continue, Settings->Apps->RecommendedApp->Permissions"); 
       Toast.makeText(this,"Please provide location permissions to continue",Toast.LENGTH_SHORT).show(); 
      } 

в качестве альтернативы:

вы можете также показать dialogfragment внутри блока поймать с помощью кнопки, чтобы взять пользователя к экрану настроек вашего app.You может сделать startActivityForResult() и ждать возвращаемого значения и проверьте, разрешающая способность ion существует

+0

Благодарю вас, сэр, я буду работать над таким подходом, который вы дали. –

+0

Нет, сэр, человек ... просто обычный разработчик :) в любом случае, как общее правило, всегда выполняйте рискованные операции внутри try-catch для обработки неожиданных результатов ... – Kushan

+0

Ow, извините. Хахаха в любом случае большое спасибо! –

Смежные вопросы