我有一个带有多个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版本/设备,并且还存在问题。