[英]Android Intent ACTION_GET_CONTENT does not return extension of file
[英]OnActivityResult sometimes not called after ACTION_GET_CONTENT intent
我正在開發一個圖像編輯 Android 應用程序。 在我的一項活動中,我調用了從onCreate() 中的圖庫中選擇圖像的意圖,如下所示:
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);
然后我收到這樣的數據:
@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");
}
}
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;
}
現在我的問題是,有時我在Crashlytics 中看到NPE-s聲稱當用戶按下下一步按鈕時 photoBitmap 為空。
@OnClick(R.id.toolbar_next)
void onToolbarNextClick() {
float originalScale = (float) (previewImageView.getHeight()) / (float) (photoBitmap.getHeight());
...
}
我看到的唯一Crashlytics日志是用戶離開的意圖(我在onPause
放置了一個Crashlytics日志)。 沒有onActivityResult
日志,所以我最好的猜測是沒有調用onActivityResult
,因此我的位圖沒有加載,因此當用戶按下下一步時它將為空。
問題:為什么有時調用onActivityResult
有時不調用? 是否還有其他可能導致photoBitmap
為空的原因?
您必須添加以下代碼才能從設備獲取圖像
choosebtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i1=new Intent();
i1.setType("image/*");
i1.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(i1,1);
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 1 && resultCode == RESULT_OK && data != null && data.getData() != null)
{
imguri=data.getData();
mainpreview.setImageURI(data.getData());
} else {
Toast.makeText(getApplicationContext(),"please choose image",Toast.LENGTH_SHORT).show();
}
}
要開始相機活動,請使用此代碼
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
獲取位圖
@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
}
}
試試這個它完美無缺
Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, LOAD_IMAGE_RESULTS);
@SuppressLint("Recycle")
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == LOAD_IMAGE_RESULTS && resultCode == RESULT_OK && data != null) {
// Let's read picked image data - its URI
Uri pickedImage = data.getData();
// Let's read picked image path using content resolver
String[] filePath = {MediaStore.Images.Media.DATA};
@SuppressLint("Recycle") Cursor cursor = null;
if (pickedImage != null) {
cursor = getContentResolver().query(pickedImage, filePath, null, null, null);
}
if (cursor != null) {
cursor.moveToFirst();
String imagePath = cursor.getString(cursor.getColumnIndex(filePath[0]));
}
}
}
現在您可以將imagepath
轉換為位圖
在您的代碼最后一行方法之后調用super.onActivityResult
。 當你打電話給超級時,你已經告訴安卓你已經完成了。
我也注意到你記錄了一個字符序列。 不要那樣做你不會用這個解決任何問題。
Crashlytics.log("Data not received");
您需要保存一些數據。 考慮用戶取消,因為您的代碼沒有捕獲這個。
/* 假設 log 方法有一個 int 輸入 */
Crashlytics.log("Data not received");
Crashlytics.log(requestCode);
Crashlytics.log(resultCode);
使用它從圖庫中選擇:
Intent i = new Intent(Intent.ACTION_PICK);
i.setType("image/*");
startActivityForResult(i, REQUEST_CODE);
現在你將在 onActivityResult 中得到一個回調:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_CODE:
if (resultCode != RESULT_CANCELED) {
//use data to get the selected image
}
break;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.