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

Android 从照相机拍照后,图像未在ImageView中设置,android,uri,android-camera,android-imageview,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(getA

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

我无法获取捕获并显示在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的原因时,抛出由于未找到
文件而导致的
空指针异常
。如果应用程序处于调试模式,它将在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上显示图像的错误在哪里吗?

我真的不知道您的代码中有什么错误,我的回答使用了一种完全不同的方法,用相机拍摄照片并在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);
文件中明确说明:文件路径包含在
Intent.mData
字段中

因此,你需要

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, absPathUri));
您可能还需要在获得结果之前让广播完成;使用

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

应该足够了。

正如gnuanu所建议的那样,
setImageURI()
不适合用作UI线程上的读取和解码,这可能会导致延迟中断

最好使用以下选项:-

setImageDrawable(android.graphics.drawable.drawable)或setImageBitmap(android.graphics.Bitmap)和BitmapFactory。

但这些方法并没有解决我的问题。当我用相机拍照时,点击一次就可以发送到下一个活动,这可能会导致延迟打嗝

因此,最好在一段时间后进行另一项活动。只要一秒钟就可以轻松度过难关

解决我的问题的代码片段:-

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);
    }

因为每次从我的应用程序中拍摄照片时,我都需要聚焦
,因为您显示的解决方案不起作用。可能会重复