在ACTION_GET_CONTENT意图之后有时不会调用OnActivityResult

WPM*_*Med 21 java android nullpointerexception android-intent onactivityresult

我正在开发一个图像编辑Android应用程序.在我的一个活动中,我打算从onCreate中的图库中选择一个图像,如下所示:

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);
Run Code Online (Sandbox Code Playgroud)

然后我收到这样的数据:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Crashlytics.log("onActivityResult called");
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == PICK_IMAGE && resultCode == Activity.RESULT_OK && data != null) {
        Crashlytics.log("Data received from image pick intent");
        imageUri = data.getData();
        loadImage();
    } else {
        //if we do not select a picture, go back to the dashboard
        Crashlytics.log("Data not received");
        onBackPressed();
        Log.d(TAG, "no picture selected");
    }
}
Run Code Online (Sandbox Code Playgroud)

loadImage方法:

private void loadImage() {
    try {
        photoBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
    } catch (IOException e) {
        Crashlytics.log("IOException from getBitmap");
        Log.d(TAG, e.getMessage());
        showToastAndPressBack();
        return;
    }

    if (photoBitmap == null) {
        Crashlytics.log("photoBitmap is null in onActivityResult");
        showToastAndPressBack();
        return;
    }

    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    imgVWidth = size.x;
    int height = size.y;
    imgVHeight = (int) (((float) imgVWidth / photoBitmap.getWidth()) * photoBitmap.getHeight());
    photoInImgViewBitmap = Bitmap.createScaledBitmap(photoBitmap, imgVWidth, imgVHeight, true);
    imageAlreadyPicked = true;
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,有时我看到Crashlytics中的NPE-s声称当用户按下下一个按钮时,photoBitmap为null.

@OnClick(R.id.toolbar_next)
void onToolbarNextClick() {
    float originalScale = (float) (previewImageView.getHeight()) / (float) (photoBitmap.getHeight());
    ...
}
Run Code Online (Sandbox Code Playgroud)

我看到的唯一一个Crashlytics日志是用户离开了意图(我在里面放了一个Crashlytics日志onPause).没有日志onActivityResult,所以我最好的猜测是onActivityResult没有调用,因此我的位图没有加载,因此当用户按下一个时它将为null.

问题:onActivityResult有时为什么叫,有时不叫?是否还有其他可能的原因photoBitmap

小智 -1

要启动相机活动,请使用此代码

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
Run Code Online (Sandbox Code Playgroud)

获取位图

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);

  if(resultCode == Activity.RESULT_OK){
    if(requestCode==CAMERA_REQUEST) {
      Bitmap photo = (Bitmap) data.getExtras().get("data"); }
    }else{
      //Camera request cancelled
  }
}
Run Code Online (Sandbox Code Playgroud)