Android 调用相机拍照并保存

不知不觉已经两年多已经没有写文章了,转眼间大学都要毕业了,也是有些唏嘘,今后会定期发表些文章,应该会以Android为主,也会夹杂其他领域的一些文章。

话不多说,今天做了一个小demo,就是调用相机拍照,然后将照片显示并存储,来先看一下效果图。
Android 调用相机拍照并保存_第1张图片
界面有些丑,实在懒得弄了,勿怪。

既然是拍照demo,所以把很多可有可无的代码都去掉了,比如权限申请之类的,但是不影响正常运行,接下来看实现代码:

首先,我们需要在主配置文件中声明provider,与activity同级别


            
        

之所以要用到provider,是因为从Android7.0开始,就不允许在 App 间,使用 file:// 的方式,传递一个 File ,否则就会抛出异常,而provider的作用恰好就是用过 content://的模式替换掉 file://,看上去只是换了个前缀,但其实是有真实路径转为了虚拟路径。

下面是provider中的一些属性:
authorities:相当与一个标识,在当前系统内必须是唯一值,一般会用包名,不过无所谓。
exported:表示该 FileProvider 是否向其他应用公开,true表示公开
granUriPermissions:是否允许授权文件的临时访问权限。这里需要,所以是 true。
meta-data,指向一个xml文件,这个xml文件的作用就是将真实的文件路径,根据设定的格式转化为虚拟路径。



    

name自己取,path表示自己想要使用的文件目录,其中external-path标签相当于Environment.getExternalStorageDirectory()路径,和path属性结合起来,就是:Environment.getExternalStorageDirectory()/img,除了external-path外,还有其他的一些标签,比如:files-path、cache-path等,我就不一一介绍了,感兴趣的可以自己查一下。

布局文件:activity_file.xml


    

    



FileActivity:

public class FileActivity extends AppCompatActivity {
    private Button cameraBtn;
    private ImageView imageView;
    private Uri ImageUri;
    private static String filePath;

    public void onCreate(Bundle saveInstanceState){
        super.onCreate(saveInstanceState);
        setContentView(R.layout.activity_file);

        cameraBtn = findViewById(R.id.btn);
        imageView = findViewById(R.id.imageView);

        cameraBtn.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                File outputImage = new File(getExternalFilesDir(null),"outputImage.jpg");
                try {
                	//创建一个文件,等待输入流
                    outputImage.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                //第二个参数与provider的authorities属性一致
                ImageUri = FileProvider.getUriForFile(FileActivity.this,"shanzang",outputImage);
				//直接使用隐式Intent的方式去调用相机,就不需要再去申请相机权限
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                //指定拍照的输出地址,当向intent传入MEdiaStore.Exter_OUTPUT参数后,表明这是一个存储动作,相机拍摄到的图片会直接存储到相应路径,不会缓存在内存中
                intent.putExtra(MediaStore.EXTRA_OUTPUT,ImageUri);
                //第二个参数为requestCode,他的值必须大于等于0,否则就不会回调
                startActivityForResult(intent,1);
            }
        });

    }

    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1) {
            if (resultCode == RESULT_OK)
                try {
                //拿到相机存储在指定路径的图片,而后将其转化为bitmap格式,然后显示在界面上
                    Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(ImageUri));
                    imageView.setImageBitmap(bitmap);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
        }
    }
}

综上

有关代码的一些解释和注意事项我都写在注释里了,应该很容易看明白,最后,再理一遍总体的逻辑:用户点击按钮之后,会通过隐式Intent的方式去调用相机,拍照之后将图片存储在指定路径,之后回调onActivityResult方法,获取到图片的输入流,将其显示在界面上。

以上就是全部内容,本人才疏学浅,若有错误,还请海涵,也欢迎指正。

你可能感兴趣的:(Android技术,java,android)