【问题标题】:using ACTION_IMAGE_CAPTURE to take picture and setImageBitmap to display it使用 ACTION_IMAGE_CAPTURE 拍照并使用 setImageBitmap 显示
【发布时间】:2011-06-03 19:20:04
【问题描述】:

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

这是我的完整的相机/图片类(imports 除外)这个类应该拍照,将其显示到屏幕上,并让另一个类拥有图片的字符串路径以用作一个附件。 它可以很好地拍摄照片,可以很好地通过电子邮件发送照片,但我无法弄清楚如何让它在拍摄后显示照片。我知道那里有一些草率的代码(比如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>

【问题讨论】:

    标签: android image bitmap imageview


    【解决方案1】:

    您需要将这两行移到 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()完成。

    【讨论】:

    • 哦,这看起来很有希望,显然这是一个开始,但我仍然得到黑屏而不是照片。想法?
    【解决方案2】:

    移动

    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)
    

    【讨论】:

    • 图片比我的屏幕大很多,但我认为android:scaleType="centerCrop" 会处理这个问题。
    • 不确定:以前从未使用过 scaleType。看看developer.android.com/reference/android/graphics/…:你应该可以强制比例匹配你的屏幕。你可能需要做一些纵横比数学,但应该不会很糟糕。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多