2017-02-15 115 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; 
} 
相关问题