首先,要再AndroidManifest配置
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" android:configChanges="orientation|keyboardHidden|screenSize"/> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
在MainActivity中
public static final int PHOTO_REQUEST_CAREMA = 1; public static File tempFile; private Uri imageUri;
页面中写一个点击按钮,我在这里用的ButterKnife绑定,直接粘代码
@BindView(R.id.img_pic) ImageView imgPic; @BindView(R.id.btn_pic) Button btnPic; @BindView(R.id.btn_on) Button btnOn;
@OnClick({R.id.btn_pic, R.id.btn_on}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.btn_pic: openCamera(this); break; case R.id.btn_on: break; } }
写一个OnActivityResult方法
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case PHOTO_REQUEST_CAREMA: if (resultCode == RESULT_OK) { Intent intent = new Intent(); //打开图片文件 intent.setDataAndType(imageUri, "image/*"); try { Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); imgPic.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } break; } }
写一个打开相机的方法
//openCamera方法 public void openCamera(Activity activity) { //获取系統版本 int currentapiVersion = android.os.Build.VERSION.SDK_INT; // 打开系统相机 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 判断存储卡是否可以用,可用进行存储 if (hasSdcard()) { //保存文件 SimpleDateFormat timeStampFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); String filename = timeStampFormat.format(new Date()); tempFile = new File(Environment.getExternalStorageDirectory(), filename + ".jpg"); //Android版本校验 if (currentapiVersion < 24) { // 从文件中创建uri imageUri = Uri.fromFile(tempFile); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); } else { //兼容android7.0 ContentValues contentValues = new ContentValues(1); contentValues.put(MediaStore.Images.Media.DATA, tempFile.getAbsolutePath()); //检查是否有存储权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //如果没有开启权限,申请WRITE_EXTERNAL_STORAGE权限 Toast.makeText(this, "请开启存储权限", Toast.LENGTH_SHORT).show(); return; } imageUri = activity.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); } } // 开启一个带有返回值的Activity activity.startActivityForResult(intent, PHOTO_REQUEST_CAREMA); }
还需要判断SdCard有没有被挂载
public static boolean hasSdcard() { return Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED); }
粘一下我的XML布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" tools:context="com.example.klaus.myapplication.MainActivity"> <ImageView android:id="@+id/img_pic" android:layout_width="180dp" android:layout_height="250dp" app:srcCompat="@mipmap/ic_launcher_round" /> <Button android:id="@+id/btn_pic" android:layout_width="190dp" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="拍摄图片" /> <Button android:id="@+id/btn_on" android:layout_width="190dp" android:layout_marginTop="5dp" android:layout_height="wrap_content" android:text="上传图片" /> </LinearLayout>
好了,大概就是这样,三星华为摄像机兼容问题没有搞定,忙着加班没时间搞····
最后,我把我的源代码贴出来,有需要的小哥哥小姐姐们去github上下载吧!