问题描述
这个方法起到的作用为什么是指定拍照的输出地址?这个方法的原型是
public Intent putExtra(String name, Parcelable value)
这个意思不是将数据以键值对的形式存储吗?为什么可以指定图片的输出地址呢?下面是完整的代码,主要目的就是点击Button进入拍照的界面,然后将拍照得到的图片存到应用关联目录下,但是学习过程中我没弄懂如何将图片保存到我指定的uri下。
public class MainActivity extends AppCompatActivity{ public static final int TAKE_PHOTO = 1; private ImageView picture; private Uri imageUri; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button takePhoto= (Button) findViewById(R.id.take_photo);picture= (ImageView) findViewById(R.id.pircture);takePhoto.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) {//创建File对象,用于存储拍照后的图片File outputImage = new File(getExternalCacheDir(),'output_image.jpg');if(outputImage.exists()){ outputImage.delete(); try {outputImage.createNewFile(); } catch (IOException e) {e.printStackTrace(); }}if (Build.VERSION.SDK_INT>=24){ imageUri = FileProvider.getUriForFile(MainActivity.this,'com.studio.cameraalbumtest.fileprovider',outputImage);}else{ 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) {switch (requestCode){ case TAKE_PHOTO: {if(resultCode == RESULT_OK){ //将拍摄的照片显示出来 try {Bitmap bitmap= BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));picture.setImageBitmap(bitmap); } catch (FileNotFoundException e) {e.printStackTrace(); }} } break;} }}
问题解答
回答1:if (Build.VERSION.SDK_INT>=24){ imageUri = FileProvider.getUriForFile(MainActivity.this,'com.studio.cameraalbumtest.fileprovider',outputImage);}else{ imageUri = Uri.fromFile(outputImage);}
这里不就指定了 图片的保存位置吗
回答2:putExtra 是用来传递参数的,我想作者是没有理解Intent 的真实用途
通过调用 intent.putExtra(String name, Parcelable value) 这个方法,是传递你要保存的图片的路径,打开相机后,点击拍照按钮,系统就会根据你提供的地址进行保存图片