从相机拍摄照片后,图像未在ImageView中设置

时间:2014-01-04 12:45:40

标签: android uri android-camera android-imageview

当我尝试在下一个显示是否保存的活动中显示捕获的图像时,我已经开发了自己的相机应用程序进行强制配置?

我无法获取我拍摄的图像并显示在我的 ImageView 上。我绝对得到absPathUri正确的道路。

代码段: -

imgView = (ImageView)findViewById(R.id.picView);
Bundle b= getIntent().getExtras();
absPathUri = Uri.parse(b.getString("URI"));
Toast.makeText(getApplicationContext(), ""+absPathUri, Toast.LENGTH_SHORT).show();
if(absPathUri!=null)
{
    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE));
    imgView.setImageURI(absPathUri);
}

开始进一步深入了解我无法设置 ImageView 的原因,抛出了由Null Pointer Exception引起的File Not Found。如果applicatoin处于调试模式,它会在 ImageView 上显示正确的图像。似乎mediaStore得到刷新,直到调试命中。

File imgFile = new  File(getPath(absPathUri));
Toast.makeText(getApplicationContext(), "ImageFile Exists"+imgFile.exists(), Toast.LENGTH_SHORT).show();
if(imgFile.exists())
 {
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
imgView.setImageBitmap(myBitmap);
}

  public String getPath(Uri photoUri) {

    String filePath = "";
    if (photoUri != null) {
        String[] filePathColumn = { MediaStore.Images.Media.DATA };
        try
        {

            Cursor cursor = getContentResolver().query(photoUri,
                    filePathColumn, null, null, null);
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            filePath = cursor.getString(columnIndex);
            cursor.close();
        }catch(Exception e)
        {
        Toast.makeText(getApplicationContext(), ""+e, Toast.LENGTH_SHORT).show();   
        }
    }
    return filePath;
}

尝试解决方案: -

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE));

任何人都可以指导我在 ImageView 上显示图片时出错吗?

3 个答案:

答案 0 :(得分:1)

正如gnuanu所建议的那样,setImageURI()在UI线程上用作读取和解码并不是更好,这可能会导致延迟打嗝。

最好使用以下内容: -

setImageDrawable(android.graphics.drawable.Drawable) or setImageBitmap(android.graphics.Bitmap) and BitmapFactory instead.

这些方法仍然无法解决我的问题。当我用相机拍照并点击它发送到下一个活动时可能会导致延迟打嗝。

在经过一段时间之后更好地传递给另一项活动。 。只需一秒钟就可以轻松完成它。

解决我的问题的片段: -

final Intent picIntent = new Intent(CameraActivity.this,PicSaveActivity.class);
picIntent.putExtra("URI", pathUri.toString());
Handler handler = new Handler() 
{
public void handleMessage(Message msg) {
    startActivityForResult(picIntent, PICTAKEN);
    };
};
 Message msg = handler.obtainMessage();
 handler.sendMessageDelayed(msg, 1000);

在“下一个活动”中,捕捉URI并按照横向模式旋转图像。

 if(absPathUri!=null)
{
    Bitmap myImg = BitmapFactory.decodeFile(absPathUri.getPath());
    Matrix matrix = new Matrix();
    matrix.postRotate(90);
    Bitmap rotated = Bitmap.createBitmap(myImg, 0, 0, myImg.getWidth(), myImg.getHeight(),
            matrix, true);
    imgView.setImageBitmap(rotated);
    }

答案 1 :(得分:0)

我真的不知道你的代码有什么问题,我的回答使用了一种完全不同的方法来用相机拍照并在ImageView中显示它,但它是一个可以帮助你的工作解决方案。

在您的第一个活动(称之为CameraActivity)中,您可以执行以下操作:

import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

public class CameraActivity extends PortraitActivity {
  private static final int CAMERA_REQUEST = 1888;
  private ImageView imageView;
  private Bitmap photo;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_camera);
  }

  /** Method to open camera and take photo */
  public void takePhoto(View v) {
    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(cameraIntent, CAMERA_REQUEST);
  }

  /** Method called after taking photo and coming back to current Activity */
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAMERA_REQUEST) {
      photo = (Bitmap) data.getExtras().get("data");
      Intent intent = new Intent(this, NewActivity.class);
      intent.putExtra("BitmapImage", photo);
      startActivity(intent);
    }
  }
}

在第二个活动(称之为NewActivity)中,在将imageView分配给XML布局中的相应视图后,只需将以下代码放入onCreate方法中。

      Intent intent = getIntent();
      Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage");
      imageView.setImageBitmap(photo);

答案 2 :(得分:0)

reference明确指出:文件的路径包含在Intent.mData字段中。

因此,您需要

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, absPathUri));

在获得结果之前,您可能还需要让广播完成;使用

imgView.post(new Runnable() { public void run() { imgView.setImageURI(absPathUri); } }

应该足够了。