使用ACTION_IMAGE_CAPTURE拍照并使用setImageBitmap显示它

时间:2011-06-03 19:20:04

标签: android image bitmap imageview

编辑我更新了代码以反映两个答案中建议的更改,不幸的是,现在我的应用程序部队关闭了。错误列在底部

这是我的相机/图片类的全部内容(除了import s)这个类应该拍照,将它显示在屏幕上,让另一个类具有图片的字符串路径用作附件。 它拍摄的图片很好,它可以很好地通过电子邮件发送图片,但我无法弄清楚如何在拍摄后将图片显示出来。我知道那里有一些草率的代码(比如onActivityResult)但是除了

之外的所有代码
Bitmap bm = BitmapFactory.decodeFile(image_string);
imageview.setImageBitmap(bm);

效果很好,所以我对寻找解决方案非常感兴趣。关于如何清理它的任何其他建议也非常受欢迎,这只是从多个不同的来源蹒跚而行。

public class LooksLike extends Activity
    {       
    Button camera;
    Intent intent;
    static String image_string;
    ImageView imageview;
    public void onCreate (Bundle savedInstanceState)
        {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lookslike);
        camera = (Button) findViewById(R.id.camera);
        imageview = (ImageView) findViewById(R.id.debris_view);
        camera.setOnClickListener(new View.OnClickListener()
            {
            public void onClick(View v)
                {
                takePhoto();
                }
            });
        }

    public void takePhoto()
        {
        intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile(this)) ); 
        startActivityForResult(intent, 1);
        Bitmap bm = BitmapFactory.decodeFile(image_string);
        imageview.setImageBitmap(bm);
        }

    private File getTempFile(Context context)
        {
        File path = new File(Environment.getExternalStorageDirectory(), context.getPackageName() );
        if(!path.exists())
            path.mkdir();
        return new File(path, "debris.jpg");
        }

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
    if (resultCode == RESULT_OK)
        {
        switch(requestCode)
            {
            case 1:
            final File file = getTempFile(this);
            try
                {
                Media.getBitmap(getContentResolver(), Uri.fromFile(file) );
                image_string = Uri.fromFile(file).toString();
                Bitmap bm = Bitmap.createScaledBitmap(
                    BitmapFactory.decodeFile(image_string),
                    getResources().getDisplayMetrics().widthPixels,
                    getResources().getDisplayMetrics().heightPixels, 
                    true);
                imageview = (ImageView) findViewById(R.id.debris_view);
              imageview.setImageBitmap(bm);
                }
            catch (FileNotFoundException e)
                {
                Toast.makeText(getApplicationContext(), "file not found exception", Toast.LENGTH_SHORT).show();
                }
            catch (IOException e)
                {
                Toast.makeText(getApplicationContext(), "ioexception", Toast.LENGTH_SHORT).show();
                }
            break;
            }
        }
    }
}

另外,这是我的xml文件:

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <ImageView  
        android:id="@+id/debris_view"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:scaleType="centerCrop"
        android:src="@drawable/icon"
        />
    <Button
        android:id="@+id/camera"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginBottom="20dip"
        android:layout_gravity="center_horizontal|bottom"
        android:padding="12dip"
        android:background="#AA000000"
        android:textColor="#ffffffff"
        android:text="would you like to take a new debris picture?"
        />
</merge>

3 个答案:

答案 0 :(得分:3)

您需要将这两行移动到onActivityResult():

case 1:
    final File file = getTempFile(this);
    try {
        Media.getBitmap(getContentResolver(), Uri.fromFile(file) );
        image_string = Uri.fromFile(file).toString();
        Bitmap bm = BitmapFactory.decodeFile(image_string);
        imageview.setImageBitmap(bm);
    } catch (FileNotFoundException e) {
        ...

takePhoto()中的代码将在startActivityForResult()之后立即执行(即它不会等待完成被调用的活动)。处理结果必须在onActivityResult()

中完成

答案 1 :(得分:1)

移动

Bitmap bm = BitmapFactory.decodeFile(image_string);
        imageview.setImageBitmap(bm);

takePhoto

 try
                        {
                        Media.getBitmap(getContentResolver(), Uri.fromFile(file) );
                        image_string = Uri.fromFile(file).toString();
Bitmap bm = BitmapFactory.decodeFile(image_string);
        imageview.setImageBitmap(bm);
                        }
                    catch (FileNotFoundException e)

答案 2 :(得分:0)

您正在加载的图片可能太大了。 将要在屏幕上显示的图像缩小到较小的尺寸,它应该没问题。 logcat应该显示一些有用的东西。