2017-02-15 31 views
0

我開發有關如何申請ACCESS_FINE_LOCATION權限,就像下面的圖片在Android 6.0應用的例子。IllegalStateException異常 - 調用DialogFragment.show的onSaveInstanceState時後不能執行這個動作()方法

enter image description here

當選擇拒絕選項我想展現給用戶自定義對話框,但它拋出以下異常:

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; 
} 
相關問題