从ExternalStorage

时间:2015-12-19 17:33:50

标签: android bitmap android-external-storage

这听起来像一个简单的任务,但我无法将相机上的位图上传到我的应用中。嗯,技术上我可以,但没有任何东西可以显示。

我使用此代码在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");
        }

2 个答案:

答案 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;
    }
}