2016-08-09 13 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

あらゆる活動の権限を実装する例。

SampleActivity.java

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

私は同じ問題に直面し、ここで活動場合android:noHistory="true"

+0

親切に小さなビットを溶かす – Panther

3

同じ問題を確認してください。

ankit jainがトラックにありました。 N.Parkの問題を修正しました。

私の場合、私はその値が真である必要がありましたが、少なくとも(私はスプラッシュスクリーンを使ってパーミッションを管理していました。

ので:

  1. 私は問題その後

  2. せずに許可を管理するアクティビティでラインandroid:noHistory="true"

  3. を削除し、私は次のアクティビティに移動:

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

アンドロイドを削除する:noHistory = "true"は問題を解決しました – Denis

関連する問題