Android 从照相机拍照后,图像未在ImageView中设置
我已经为强制配置开发了自己的相机应用程序,当我试图在下一个活动中显示捕获的图像时,显示是否保存它 我无法获取捕获并显示在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
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);
}
因为每次从我的应用程序中拍摄照片时,我都需要聚焦,因为您显示的解决方案不起作用。可能会重复