2016-08-02 1 views
0

Android 마시맬로에서 런타임 권한을 처리하는 데 어려움이 있으며 정말 손이 필요합니다. 문제는 런타임 권한을 거부 할 때 (대화 상자가 표시 될 때) 앱이 충돌합니다. 보다 자세하게, 현재 실행중인 활동이 다시 시작됩니다 (단지 응용 프로그램 충돌이라고 부름).Android 마샬 멜로우에서 런타임 권한 거부 앱

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이 발생할 때 메시지 나 다른 것을 표시해보십시오.

예 ... 난 ...

ERRORTEXT 사용자가 할 필요가 무엇인지 보여주기 위해 화면 중앙에 표시되는 텍스트 뷰입니다 ... 권한을 요청 후 위치 권한에 대해 다음을 사용 또한

  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(); 
      } 

: 당신은 또한 startActivityForResult()을 할 수 있습니다 app.You의 설정 화면으로 사용자를 가지고 반환 된 값을 기다리고 있는지 확인하기 위해 버튼을 catch 블록 내부 dialogfragment을 표시 할 수 있습니다

그 허가 지금 이온이 존재합니다

+0

감사합니다. 선생님,이 접근법에 대해 알아 보겠습니다. –

+0

아니 선생님, 남자 ... 그냥 일반 개발자 :) 어쨌든 엄지 손가락의 일반적인 규칙으로, 예기치 않은 결과를 처리하기 위해 항상 try-catch 내부에서 위험한 작업을 수행하십시오 ... – Kushan

+0

Ow, 죄송합니다. 하하하 어쨌든 고맙습니다! –