关闭调用活动

时间:2016-02-05 16:17:16

标签: android image android-asynctask uri media

我有一个带有多个ImageView的Activity,显示通过调用相机意图检索的图像。在onActivityResult上,我存储了返回的图像,以供以后进行后台处理。

问题是:一旦我完成了调用活动,我存储的一些URI(传递给AsyncTask)是无效的,当我尝试加载它们时(即使用Glide),引发一个NullPointerException。

我无法在后台处理期间保持活动运行,这需要一些时间并给用户带来糟糕的体验。

我在尝试获取图像时尝试了其他方法,认为读取权限可用性和生命周期与调用方法有关(例如,在文件系统中创建文件并将其传递给摄像头意图),但这一切都没有奏效。

我尝试使用不同的设备和不同的Android版本并且问题仍然存在,是否是Android的隐式模式?

你们有没有遇到过这个问题?

相机和画廊意图调用:

    public static void getCameraImage(Activity activity) {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) {
        activity.startActivityForResult(takePictureIntent, Codes.CAMERA_IMAGE);
    }
}

public static void getGalleryImage(Activity activity){
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    activity.startActivityForResult(intent, Codes.GALLERY_IMAGE);
}

onActivityResult:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (resultCode == RESULT_OK &&
            (requestCode == Codes.CAMERA_IMAGE || requestCode == Codes.GALLERY_IMAGE)) {

        Uri uri = intent.getData();

        Glide.with(this)
                .load(uri)
                .fitCenter()
                .centerCrop()
                .into((ImageView) findViewById(myImageViewId));

        savedUri = uri;            
    }
}

AsyncTask调用:

//PostImages extends AsyncTask
PostImages post = new PostVehicleImages(savedUri);
post.execute();
finish()

异步任务执行:

@Override
protected Void doInBackground(Void... params) {

    callService(savedUri);

    return null;
}

private void callService(Uri savedUri) {

    Bitmap image = null;
    try{
        image = Glide.with(App.getAppContext())
                .load(savedUri) //<----- crashes here
                .asBitmap()
                .into(640, 640)
                .get();
    }catch(Exception e){
        e.printStackTrace();
    }

    Retrofit retrofit = ServiceBuilder.getBuilder();

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    byte[] byteArray = stream.toByteArray();

    RequestBody file = RequestBody.create(MediaType.parse("image/jpeg"), byteArray);
    VehicleService service = retrofit.create(VehicleService.class);

    Call<Void> call = service.sendImage(credentials, vehicleID, index, file);

    try {
        call.execute();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

我在验证Uri并且用户按下按钮(发送)后调用PostImages。 AsyncTask接收Uri,加载它,然后将其发送到Web服务器,即AsyncTask。

我简化了一点(当我调用AsyncTask时,我向其传递了4个URI),有时一个或两个正确发送,但从来没有全部成功,它在从Uri加载位图时引发NullPointerException声明.load(savedUri)

我已尝试使用指向文件路径,但显然它在很大程度上取决于SDK版本/设备,并且还存在问题。

0 个答案:

没有答案