当我尝试在下一个显示是否保存的活动中显示捕获的图像时,我已经开发了自己的相机应用程序进行强制配置?
我无法获取我拍摄的图像并显示在我的 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 上显示图片时出错吗?
答案 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); } }
应该足够了。