这听起来像一个简单的任务,但我无法将相机上的位图上传到我的应用中。嗯,技术上我可以,但没有任何东西可以显示。
我使用此代码在onClick
上拍照:
count++;
file = dir+count+".jpg";
File newfile = new File(file);
try {
newfile.createNewFile();
} catch (IOException e) {}
Uri outputFileUri = Uri.fromFile(newfile);
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(cameraIntent, TAKE_PHOTO_CODE);
其中
dir
- final String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
此图片加载代码:
String location = new String(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/" + count + ".jpg");
Bitmap myBitmap = BitmapFactory.decodeFile(location);
Bitmap mutableBitmap = myBitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(mutableBitmap);
wv2.draw(canvas);
tstImage.setImageBitmap(mutableBitmap);
text.setText(Float.toString(myBitmap.getHeight()) + " " + Float.toString(myBitmap.getWidth()) + " px");
其中
count
- 表示图像名称的整数
wv2
- 自定义WebView,我在其中绘制画布。
我不认为这些行是相关的,但发布其他信息并不会有什么坏处 - 你永远不会知道。
Canvas canvas = new Canvas(mutableBitmap);
wv2.draw(canvas);
此行显示包含图像尺寸的文本。我用它来检查我是否加载了位图。
text.setText(Float.toString(myBitmap.getHeight()) + " " + Float.toString(myBitmap.getWidth()) + " px");
当我运行此代码时,图像不会显示,但文本显示正确的尺寸,这应该意味着我会加载位图。我究竟做错了什么?问题在哪里?
[UPDATE]
我想我正在取得进步。现在我出现了OutMemory问题,应用程序崩溃了。
String path = Environment.getExternalStorageDirectory()+ "/Pictures/" + count + ".jpg";
File imgFile = new File(path);
if(imgFile.exists()){
Bitmap mBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
tstImage.setImageBitmap(mBitmap);
} else {
Log.d("Ciaren", "File doesn't exist");
}
答案 0 :(得分:1)
OOM表示图像太大而无法处理内存。这里有两种解决方案:
要么在清单中强行使用withPopup
,这是可以的,但可能导致将来出现问题。
或者您可以更改位图加载的选项,因此一次只需要更少的内存。因此,图像将需要更多时间来加载,但消除了崩溃的可能性。此外,时差几乎不可察觉。
答案 1 :(得分:0)
取代使用位图图像获取uri或路径并使用picasso将该图像加载到imageView
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
switch(requestcode){
case MEDIA_TYPE_IMAGE:
Uri selectedImageUri = data.getData();
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), seletedImageUri);
Picasso.with(getContext()).load(selectedImageUri).fit().into(imgDp);
break;
}
}