2017-02-15 13 views
0

次の画像のように、ACCESS_FINE_LOCATION権限を要求する方法に関するAndroid 6.0アプリケーションのサンプルを開発しています。 IllegalStateException - DialogFragment.show()メソッドを呼び出すときにonSaveInstanceStateの後にこのアクションを実行できません。

enter image description here

は、私は、ユーザーのカスタムダイアログに表示するオプションをDENY選択するとき、それは次の例外をスロー:メソッドを呼び出したときにスローされる

IllegalStateException - Can not perform this action after onSaveInstanceState

grantPermissionDialog.show(getSupportFragmentManager(),"GrantPermissionDialog"); 

onRequestPermissionsResultメソッド内

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if(requestCode == REQUEST_ACCESS_FINE_LOCATION){ 
     if(grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
      Toast.makeText(this, "Location permission granted", Toast.LENGTH_LONG).show(); 
     }else{ 
      grantPermissionDialog.show(getSupportFragmentManager(),"GrantPermissionDialog"); 
     } 
    } 
} 

これは、getSupportFragmentManager()メソッドが呼び出されたためです。 ここに私のGrantPermissionDialogコードです。

public class GrantPermissionDialog extends DialogFragment { 

private int statusCode; 
private String message="El permiso de ubicación es necesario para que esta aplicación funcione."; 
private String positiveButtonText="Salir"; 
private String negativeButtonText="Solicitar permiso"; 
public static int EXIT_APPLICATION=0; 
public static int REQUEST_PERMISSION=1; 

@NonNull 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setMessage(message); 
    builder.setPositiveButton(positiveButtonText, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
       statusCode = EXIT_APPLICATION; 
     } 
    }); 
    builder.setNegativeButton(negativeButtonText, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      statusCode = REQUEST_PERMISSION; 
     } 
    }); 
    return builder.create(); 
} 


public int getStatusCode() { 
    return statusCode; 
} 

}

この問題を解決する方法上の任意のアイデアは?

+0

エラーログも追加します –

答えて

3

これは既知のシナリオであり、hereでよく説明されています。アクティビティの状態が

あなたは(あなたのショーを移動する必要があります)ダイアログのコードを保存した後、あなたがFragmentTransactionをコミットしようとしたため、その記事によると、それは

原因だ「onPostResume()」および使用上記のフラグhere

private boolean mRequestPermissionsWithResult = false;  

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if(requestCode == REQUEST_ACCESS_FINE_LOCATION){ 
     if(grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
      Toast.makeText(this, "Location permission granted", Toast.LENGTH_LONG).show(); 
     }else{ 
      mRequestPermissionsWithResult = true; 
     } 
    } 
} 

@Override 
protected void onPostResume() { 
    super.onPostResume(); 
    if (mRequestPermissionsWithResult) { 
     grantPermissionDialog.show(getSupportFragmentManager(),"GrantPermissionDialog"); 
    } 
    mRequestPermissionsWithResult = false; 
} 
関連する問題