一个活动出现在我的应用程序中的其他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.
答案 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 。