Java 第二次从存储器中选择图像时出现NullPointerException,第一次选择时没有NullPointerException
我设置了一个按钮,用于检查Java 第二次从存储器中选择图像时出现NullPointerException,第一次选择时没有NullPointerException,java,android,nullpointerexception,android-permissions,android-package-managers,Java,Android,Nullpointerexception,Android Permissions,Android Package Managers,我设置了一个按钮,用于检查读取外部存储权限,然后打开用户手机存储显示图像。我已通过以下代码成功地完成了此操作: 所有这些在第一次尝试时都非常有效。用户看到“权限”对话框,按“同意”,图像选择器打开,在手机上显示图像!然而,当我们第二次尝试使用相同的按钮时,应用程序崩溃。因此,基本上在授予权限后,每次按下按钮,应用程序都会崩溃 将显示以下错误: E/AndroidRuntime: FATAL EXCEPTION: main Process: com.memory.pod.debug, PI
读取外部存储
权限,然后打开用户手机存储显示图像。我已通过以下代码成功地完成了此操作:
所有这些在第一次尝试时都非常有效。用户看到“权限”对话框,按“同意”,图像选择器打开,在手机上显示图像!然而,当我们第二次尝试使用相同的按钮时,应用程序崩溃。因此,基本上在授予权限后,每次按下按钮,应用程序都会崩溃
将显示以下错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.memory.pod.debug, PID: 26684
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.PackageManager android.content.Context.getPackageManager()' on a null object reference
at android.content.ContextWrapper.getPackageManager(ContextWrapper.java:98)
at com.memory.pod.camerax.ui.home.HomeActivity.selectImage(HomeActivity.java:144)
at com.memory.pod.camerax.ui.home.HomeActivity.openFileChooser(HomeActivity.java:137)
at com.memory.pod.view.BottomTabView$4.onClick(BottomTabView.java:84)
at android.view.View.performClick(View.java:7259)
at android.view.View.performClickInternal(View.java:7236)
at android.view.View.access$3600(View.java:801)
at android.view.View$PerformClick.run(View.java:27892)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
BottomTabView.java
公共类BottomTabView扩展FrameLayout实现ViewPager.OnPageChangeListener{
//初始化内容
私有ImageView-mCenterImageView;
私有图像视图MBotomImageView;
private LinearLayout mStartImageView;
私人线路布局图;
私家视角;
私人资产评估人保证金评估人;
私人int mCenterColor;
私营企业脱色;
私家车;
私密信息传输;
私有int MCENTERTRANSACTIONY;
公共底部选项卡视图(@NonNull上下文){
这个(上下文,空);
}
public BottomTabView(@NonNull上下文,@Nullable AttributeSet attrs){
这(上下文,属性,0);
}
public BottomTabView(@NonNull上下文,@Nullable AttributeSet attrs,int defStyleAttr){
super(上下文、attrs、defStyleAttr);
init();
}
使用ViewPager(ViewPager ViewPager)的公共无效设置{
viewPager.addOnPageChangeListener(此);
mStartImageView.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图){
如果(viewPager.getCurrentItem()!=0)
viewPager.setCurrentItem(0);
}
});
mCenterImageView.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图){
如果(viewPager.getCurrentItem()!=1)
viewPager.setCurrentItem(1);
}
});
mEndImageView.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图){
如果(viewPager.getCurrentItem()!=2)
viewPager.setCurrentItem(2);
}
});
mBottomImageView.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图){
如果(viewPager.getCurrentItem()==1){
openFileChooser(getContext());
}
}
});
}
私有void init(){
LayoutInflater.from(getContext()).flate(R.layout.view\u bottom\u选项卡,此为true);
//初始化底部选项卡视图内容
mCenterImageView=findViewById(R.id.view\u bottom\u tabs\u camera\u iv);
mStartImageView=findViewById(R.id.view\u bottom\u tabs\u start\u linear\u布局);
mEndImageView=findViewById(R.id.view\u bottom\u tabs\u end\u linear\u布局);
mBottomImageView=findViewById(R.id.view\u bottom\u tabs\u gallery\u iv);
//初始化底部选项卡视图指示器,用于指示视图中的当前选项卡
mIndicator=findViewById(R.id.视图\底部\选项卡\指示器);
//设置选项卡视图图标的开始颜色和结束颜色
mCenterColor=ContextCompat.getColor(getContext(),R.color.white);
mSideColor=ContextCompat.getColor(getContext(),R.color.black);
//评估颜色之间的差异
mArgbEvaluator=新的argbeevaluator();
//根据视图更改选项卡图标的填充
//这是接受的最小填充(0)
mIndicatorTranslationX=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,140,getResources().getDisplayMetrics());
//等待绘制GalleryMageView,绘制GalleryMageView后,继续进行相对填充计算
mBottomImageView.getViewTreeObserver().addOnGlobalLayoutListener(新ViewTreeObserver.OnGlobalLayoutListener()){
@凌驾
公共图书馆{
//相对于其他图标更改填充
mEndViewsTranslationX=(int)((mBottomImageView.getX()-mStartImageView.getX())-MindItactOrTranslationX);
mBottomImageView.getViewTreeObserver().removeOnGlobalLayoutListener(此);
//更改中心图像的位置
mcentertransationy=getHeight()-mBottomImageView.getBottom();
}
});
}
@凌驾
已滚动页面上的公共无效(int-position、float-positionOffset、int-positionOffsetPixels){
如果(位置==0){
//根据视图更改图标的颜色
设置颜色(1-位置偏移);
//移动开始和结束图像
移动视图(1-位置偏移);
//改变指示器位置
mIndicator.setTranslationX((位置偏移-1)*mIndicator TranslationX);
//更改中心图像的比例
移动和缩放中心(1-位置偏移);
}否则如果(位置==1){
//根据视图更改图标的颜色
设置颜色(位置偏移);
//移动开始和结束图像
移动视图(位置偏移);
//改变指示器位置
mIndicator.setTranslationX(位置偏移*mIndicator TranslationX);
//更改中心图像的比例
移动和缩放中心(位置偏移);
}
}
@凌驾
已选择页面上的公共无效(内部位置){
}
@凌驾
公共无效onPageScrollStateChanged(int状态){
}
私有void moveAndScaleCenter(float fractionFromCenter){
浮动比例=.7 f+((1-从中心开始的分数)*.3 f
else {
new HomeActivity().selectImage();
}
else{
selectImage();
}
public class BottomTabView extends FrameLayout implements ViewPager.OnPageChangeListener {
// Initialize content
// add this at top level.
BottomTabViewClickListener bottomTabViewClickListener;
//add this function somewhere
public void setOnBottomTabViewClickListener(BottomTabViewClickListener bottomTabViewClickListener){
this.bottomTabViewClickListener = bottomTabViewClickListener;
}
// replace HomeActivity.openFileChooser(getContext());
mBottomImageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (viewPager.getCurrentItem() == 1) {
bottomTabViewClickListener.onClick();
}
}
});
}
//end of BottomTab View
//add this after your BottomTabView not inside
interface BottomTabViewClickListener{
public void onClick();
}
// Initialize BottomTabView
BottomTabView bottomTabView = findViewById(R.id.bottom_tabs);
bottomTabView.setUpWithViewPager(viewPager);
bottomTabView.setOnBottomTabViewClickListener(new BottomTabViewClickListener() {
@Override
public void onClick() {
// call your openFileChooser from here,
//REMOVE THE STATIC
openFileChooser(HomeActivity.this)
}
});