Android Camera 拍照
本节给大家讲解了如何去调用系统自带相机获取拍照后的图片,以及自己写 Carema 来 完成自定义相机
Android 中的 Camera 有两种使用方法
-
调用系统自带相机拍照,然后获取拍照后的图片
-
自定义拍照界面
权限
调用系统相机和保存照片需要用到两个权限
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
调用系统自带 Carema
只需要简单的几行代码,就可以调用 Android 自带的系统相机
Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(it,Activity.DEFAULT_KEYS_DIALER);
相机拍照后会返回一个 intent
给 onActivityResult()
方法
intent 的 extra
参数则包含一个编码过的 Bitmap
//重写 onActivityResult() 方法 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == Activity.RESULT_OK){ Bundle bundle = data.getExtras(); Bitmap bitmap = (Bitmap) bundle.get("data"); ms_img_show.setImageBitmap(bitmap); } }
保存照片
拍完的图片是不会保存到本地的
需要我们自己手动写代码把图片保存到我们的 SD 卡里
//定义一个保存图片的 File 变量 private File currentImageFile = null; //在按钮点击事件处写上这些东西,这些是在SD卡创建图片文件的: @Override public void onClick(View v) { // 创建文件夹,如果不存在则忽略 File dir = new File(Environment.getExternalStorageDirectory(),"pictures"); if(dir.exists()){ dir.mkdirs(); } // 创建图片文件,如果不存在则新建 currentImageFile = new File(dir,System.currentTimeMillis() + ".jpg"); if(!currentImageFile.exists()){ try { currentImageFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } Uri imageUri = null; if (Build.VERSION.SDK_INT>=24) { imageUri = FileProvider.getUriForFile(MainActivity.this,getPackageName() + ".fileprovider",currentImageFile); } else { imageUri = Uri.fromFile(currentImageFile); } // 调用系统相机 Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); it.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(it, Activity.DEFAULT_KEYS_DIALER); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == Activity.DEFAULT_KEYS_DIALER) { ms_img_show.setImageURI(Uri.fromFile(currentImageFile)); } }
范例
-
创建一个 空的 Android 项目
cn.twle.android.Camera
-
修改
activity_main.xml
采用线性布局,添加一个 VideoView 和三个 Button<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp"> <Button android:id="@+id/btn_camera" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="拍照" /> <ImageView android:id="@+id/ms_img_show" android:scaleType="centerInside" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
-
修改
AndroidManifest.xml
添加调用系统相机和 SD 卡权限<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-
修改
AndroidManifest.xml
添加provider
<provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /> </provider>
-
然后在
res
目录下创建资源目录xml
并添加文件res/xml/provider_paths.xml
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <root-path name="name" path="" /> <external-path name="external_files" path="pictures"/> </paths>
-
修改
MainActivity.java
package cn.twle.android.camera; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.support.v4.content.FileProvider; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.ImageView; import java.io.File; import java.io.IOException; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ImageView ms_img_show; private Button btn_camera; //定义一个保存图片的 File 变量 private File currentImageFile = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ms_img_show = (ImageView) findViewById(R.id.ms_img_show); btn_camera = (Button) findViewById(R.id.btn_camera); btn_camera.setOnClickListener(this); } //在按钮点击事件处写上这些东西,这些是在SD卡创建图片文件的: @Override public void onClick(View v) { File dir = getExternalFilesDir("pictures"); if(dir.exists()){ dir.mkdirs(); } currentImageFile = new File(dir,System.currentTimeMillis() + ".jpg"); if(!currentImageFile.exists()){ try { currentImageFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } Uri imageUri = null; if (Build.VERSION.SDK_INT>=24) { imageUri = FileProvider.getUriForFile(MainActivity.this,getPackageName() + ".fileprovider",currentImageFile); } else { imageUri = Uri.fromFile(currentImageFile); } // 调用系统相机 Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); it.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(it, Activity.DEFAULT_KEYS_DIALER); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == Activity.DEFAULT_KEYS_DIALER) { ms_img_show.setImageURI(Uri.fromFile(currentImageFile)); } } }