Android调用系统相机拍照及图片保存的Uri方式------菜鸟学习历程

 关于调用系统相机的文章百度一下很多, 但是有两个关键点是值得注意以下的:

    一、使用Uri直接保存照片文件,要特别注意Uri目标文件的创建方式 千万不能混淆否则会搞的很郁闷

if (v.getId() == R.id.btn_camera) { // 不指定Uri
   Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
   startActivityForResult(intent, 1);
}
if
(v.getId() == R.id.btn_camera01) { // 指定Uri
   Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
   String dirPath = Environment.getExternalStorageDirectory().getAbsolutePath();
   // 要特别注意存放照片文件的形成方式
   
// file = new File(dirPath +
"/" + "nihao.jpg");  形成文件的 路径,路径哦
   
// 注意两种写法的不同
   
file = new File(dirPath,
"nihao.jpg");  // dirPath文件夹下的"nihao.jpg"文件
   
Uri imageUri = Uri.fromFile(file);
   intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
   startActivityForResult(intent, 1); // 这里为了比较 两种方式的requestCode码都写为1
}

    二、  使用Uri直接保存照片文件, 回调方法中data是不会返回值的, 如果没有data是否为空的判断,会报空指针的呦系统保存的是文件,要操作Bitmap需要我们去利用BitmapFactory从文件中读取出来

    

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);

   if (requestCode == 1 && resultCode == RESULT_OK) {
       if (data != null) { // 如果没有指定Uri则返回的data是带值的
           
Bundle bundle = data.getExtras();
           bitmap = (Bitmap) bundle.get("data");
           imageView.setImageBitmap(bitmap);
           // data返回的图片保存在指定的文件中
           
saveToFile(bitmap);
       } else {  // 如果指定了Uri则返回的data为空,bitmap图片需要从指定的Uri路径去获取
           
Toast.makeText(this, "照片保存路径:" + file.getAbsolutePath(),
                   Toast.LENGTH_SHORT).show();
           bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
           // 将图片在imageView上显示出来
           
imageView.setImageBitmap(bitmap);
       }

   }
}

    没有指定Uri时,保存图片

private void saveToFile(Bitmap bitmap) {
   if (!Environment.getExternalStorageState().equals(
           Environment.MEDIA_MOUNTED)) {
       Toast.makeText(this, "SD未插入或不可用!", Toast.LENGTH_SHORT).show();
       return;
   }
   String path = Environment.getExternalStorageDirectory().getAbsolutePath();
   SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
   fileName = df.format(new Date());
   File file = new File(path, fileName + ".jpg");
   try {
       FileOutputStream fos = new FileOutputStream(file.getAbsolutePath());
       // 将图片压缩成其他格式的图片数据
       
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
       fos.flush();
       fos.close();
   } catch (FileNotFoundException e) {
       e.printStackTrace();
   } catch (IOException e) {
       Toast.makeText(this, "保存失败", Toast.LENGTH_LONG).show();
       e.printStackTrace();
   }
}



你可能感兴趣的:(uri,系统相机)