关于安卓相机拍照的一些问题

昨天开始做安卓方面的一些东西,关于用手机拍照,然后把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:也见到说用广播的,但安卓新系统貌似权限不开放哟!所以还是用上面那种万能的办法吧!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值