从应用转到设置时,我的应用崩溃了,设置中的权限已更改并返回到应用

时间:2018-11-27 11:56:42

标签: java android

一个活动出现在我的应用程序中的其他3个活动之后,需要存储权限(用于选择文件),因此,在我可以选择文件之前,请检查该应用程序是否具有该权限。 因此,要进行测试,请在已授予存储权限的情况下进行此活动,然后转到设置,切换权限状态,然后返回到应用程序。 启动了相同的活动,但稍后崩溃,在我使用先前活动意图发送的变量的代码部分上显示NullPointerException。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera);
        pictureSettings = (Picture) ((ApplicationContext) this.getApplication()).map.get(Objects.requireNonNull(getIntent().getExtras()).getInt("Sequence"));
        setOrientation(pictureSettings.getOrientation()); //getOrientation function gives error - java.lang.String com.example.Picture.getOrientation()
    }

崩溃日志

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app}: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.flow.PictureClass.getOrientation()' on a null object reference.

3 个答案:

答案 0 :(得分:0)

您必须检查

getIntent.getextras(Bundle)在之前不为空

pictureScreenParameters = (PictureScreenClass) ((ApplicationContext) this.getApplication())
          .flowMap.get(Objects.requireNonNull(getIntent().getExtras()).getInt("Sequence"));

如果调试应用程序为空,则可能是您使用了错误的上下文,

答案 1 :(得分:0)

当然可以,在某些情况下getExtras()可能返回null,不再有可用的意图数据。活动开始时,它期望使用putExtras()方法从上一个活动发送一些数据,但是从 Settings 发送的数据尚未发送,并且您没有保存实例。

您必须从检查返回的意图及其扩展数据开始进行检查:

Bundle extras=null;

Intent intent = getIntent(); 

if(intent!=null){
  extras=intent.getExtras()
} 

然后在使用前,测试extras是否不为null。只是因为您不确定活动会在发送额外内容的活动之后始终启动/继续/重新开始。

关于请求权限,我认为最好以编程方式测试权限并直接在活动中请求权限,而不是切换到设置并手动添加。

答案 2 :(得分:0)

切换权限后,应用将被杀死,而当您切换回去时,它会尝试重新启动上一个活动,,而不会启动以前启动的基础活动。在您的情况下,您的第四个活动已重新启动,但3个旧的活动未重新启动。

从您的代码中,我看到您的活动需要一些应该在开始之前初始化的数据:

pictureScreenParameters = (PictureScreenClass)((ApplicationContext) this.getApplication()).flowMap.get(Objects.requireNonNull(getIntent().getExtras()).getInt("Sequence"))

这可能被认为是不好的做法。 Android重新启动活动后,pictureScreenParameters尚未初始化,显然是null

建议:
 1.使用之前,请检查pictureScreenParameters是否为空。如果为空,请尝试将其初始化或使用默认值。  2.在更新的Android版本(6.0或更高版本)上,您应该在运行时请求存储和其他权限:Request permissions at runtime appropriately