Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 第二次从存储器中选择图像时出现NullPointerException,第一次选择时没有NullPointerException_Java_Android_Nullpointerexception_Android Permissions_Android Package Managers - Fatal编程技术网

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)
            }
        });