2016-08-09 1 views
9

내 로그인 화면에서 필요한 권한을 확인합니다. 대화 상자에 필요한 4 가지 권한을 묻는 메시지가 표시됩니다. 모두 좋지만 대화 상자가 나타나면 배경이 검은 색이되고 내 앱이 닫힙니다 (충돌하지 않고 닫히기 만 함). 권한을 선택했으면 앱을 다시 열고 앱이 중단 된 곳에서 계속 실행합니다. 권한 대화 상자가 표시된 상태에서 앱을 계속 실행하려면 어떻게해야합니까? 사용 권한을 확인하고 로그인 활동에서 호출하는 클래스를 사용합니다.Android M 권한으로 내 애플리케이션 닫기

클래스 :

public abstract class RuntimePermissionsActivity extends AppCompatActivity { 
private SparseIntArray mErrorString; 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    mErrorString = new SparseIntArray(); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){ 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    int permissionCheck = PackageManager.PERMISSION_GRANTED; 
    for (int permission : grantResults){ 
     permissionCheck = permissionCheck + permission; 
    } 
    if ((grantResults.length>0) && permissionCheck == PackageManager.PERMISSION_GRANTED){ 
     onPermissionsGranted(requestCode); 
    } 
    else { 

       Intent intent = new Intent(); 
       intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
       intent.addCategory(Intent.CATEGORY_DEFAULT); 
       intent.setData(Uri.parse("package:" + getPackageName())); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
       intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
       startActivity(intent); 
    } 
} 

public void requestAppPermissions(final String[] requestedPermissions, final int requestCode){ 
    int stringId = 0; 
    mErrorString.put(requestCode, stringId); 
    int permissionCheck = PackageManager.PERMISSION_GRANTED; 
    boolean shouldShowRequestPermissionRationale = false; 
    for (String permission : requestedPermissions){ 
     permissionCheck = permissionCheck + ContextCompat.checkSelfPermission(this, permission); 
     shouldShowRequestPermissionRationale = ActivityCompat.shouldShowRequestPermissionRationale(this, permission); 
    } 
    if(permissionCheck != PackageManager.PERMISSION_GRANTED){ 
     if(shouldShowRequestPermissionRationale){ 
        ActivityCompat.requestPermissions(RuntimePermissionsActivity.this, requestedPermissions, requestCode); 
     } 
     else { 
      ActivityCompat.requestPermissions(this, requestedPermissions, requestCode); 
      Toast.makeText(RuntimePermissionsActivity.this, "Please relaunch the application in order for the changes to take effect!", Toast.LENGTH_LONG).show(); 
     } 
    } 
    else { 
     onPermissionsGranted(requestCode); 
    } 

} 
public abstract void onPermissionsGranted(int requestCode); 
} 

로그 활동 호출 :

LoginActivity.super.requestAppPermissions(new 
      String[]{Manifest.permission.READ_CONTACTS, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, 
      Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS); 
+0

캔트가 실제로 무엇을하는지 이해함 –

+0

@MohammedAtif Android M 이후에 설치 중에 권한이 부여되지 않고 앱이 시작된 이후에 권한이 런타임에 부여되는지 확인합니다. –

+0

@ N.Park 내 대답을 확인하십시오. http://stackoverflow.com/a/33163206/3395198 –

답변

4

어떤 활동에 권한을 구현의 예.

내가 같은 문제에 직면

public class SampleActivity extends AppCompatActivity{ 
    private final int PERMISSION_CODE = 1; 
    Button button; 
    @override 
    onCreate(Bundle savedInstance){ 
     super.onCreate(savedInstance); 
     setContentView(R.layout.your_layout); 
     button = (Button)findViewById(R.id.button); 
     button.setOnClickListener(new OnClickListener(){ 
      @override 
      public void onClick(View view){ 
       requestPermissionAndContinue(); 
      } 
     }); 
     //remaining code to continue using the app 
     //your actual code should also be in this same class 
    } 

    private void requestPermissionAndContinue(){ 
     if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){ 
      if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)){ 
       Log.e(TAG, "permission denied, show dialog"); 
      }else{ 
       ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, PERMISSION_CODE); 
      } 
     }else{ 
      accessContacts(); 
     } 
    } 

    private void accessContacts(){ 
     //your code once you receive permission 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     if(grantResults.length > 0 && permissions[0]==PackageManager.PERMISSION_GRANTED){ 
      accessContacts(); 
     }else{ 
      //redirect to settings page or ask permission again 
     } 
    } 
} 
+0

예 예.나는 그렇게 생각한다 –

9

SampleActivity.java, 여기 경우 활동 android:noHistory="true"

+0

좋은 작은 눈동자 – Panther

3

같은 문제를 확인하십시오.

ankit jain은 트랙에있었습니다. android:noHistory="true"을 제거하면 N.Park 문제가 해결되었습니다.

필자의 경우 사실이거나 적어도 퍼블리시를 관리하는 SplashScreen을 필요로하는 값을 필요로했지만, 다음 단계로 이동하면 내 스택에서 해당 Activity를 원했습니다.

그래서 :

:

  1. 가 나는 문제없이 허가 그 후

  2. 를 관리 활동에서 라인 android:noHistory="true"

  3. 를 삭제, 내가 함께 다음 활동으로 이동

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+0

android 제거 : noHistory = "true"는 문제를 해결했다. – Denis