昨天开始做安卓方面的一些东西,关于用手机拍照,然后把URI传送给别的模块用于显示(公司项目,各种复杂看不懂耶)
菜鸟嘛,看着书写了一个demo,能够愉快的拍照然后显示在imageView中。
public class MainActivity extends Activity {
public static final int TAKE_PHOTO = 1;
public static final int CROP_PHOTO = 2;
private Button takePhoto;
private ImageView picture;
private Uri imageUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
takePhoto = (Button) findViewById(R.id.take_photo);
picture = (ImageView) findViewById(R.id.picture);
takePhoto.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
File outputImage = new File(Environment.getExternalStorageDirectory(), "tempImage.jpg");
try {
if (outputImage.exists()){
outputImage.delete();
}
outputImage.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
imageUri = Uri.fromFile(outputImage);
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, TAKE_PHOTO);
}
}) ;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case TAKE_PHOTO:
if (resultCode == RESULT_OK){
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(imageUri, "image/*");
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, CROP_PHOTO);
}
break;
case CROP_PHOTO:
if (resultCode == RESULT_OK){
try {
Bitmap bitmap = BitmapFactory.decodeStream
(getContentResolver().openInputStream(imageUri));
picture.setImageBitmap(bitmap);
} catch (Exception e) {
e.printStackTrace();
}
}
break;
default:
break;
}
}
}
以上都很正常。
但是demo移植到项目的过程中,我们想要把uri从onActivityResult传入的Intend data中取到,
无奈指定路径时无论如何data都为null:
只要加上下面这句话,data返回就为null--
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
网上搜了一下,大神宣雨松MOMO的博客里竟然也有相关内容,不过他却取到值了,仔细一看评论,大神的手机是谷歌的。。。
所以这就是亲生的待遇啊!!
那肿么办呢?
那就不指定路径了吧:即将代码中intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);注释掉
此时再在传入的data就能取到值了,然后发现坑爹的事情来了,data里只返回了一个bitmap。。。
项目里要的是uri啊!!
愚蠢的我试着把bitmap转成需要的路径(这个百度都能搜到的),发现图片是有的,只不过像素渣到不能看。
万般无奈下又转回到了第一种方式:指定URI:先在数据库中插入照片,再将uri指定给intent。。。
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
photoUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
sActivity.get().startActivityForResult(intent, INTENT_IMAGE_SELECTOR_ACTIVITY);
然后把uri记录在类里,在onActivityResult里直接拿来用 - -
虽然蠢蠢的但至少能用了呀!
然后坑爹的事情又粗现了。
照完的照片是存在安卓相机的目录下,但图库里就是不!显!示!
于是我又开始了百度生涯:
MediaScannerConnection.scanFile(content, new String[] { path }, null, null);
//path是路径,打印出来是这样的:/storage/sdcard0/DCIM/Camera/XXX.jpg
一开始把path传错,导致刷新不成功,检查后执行成功!拍过的照片可以立即显示在图库中啦!
PS:也见到说用广播的,但安卓新系统貌似权限不开放哟!所以还是用上面那种万能的办法吧!