Android从本地获取照片以及调用手机拍照功能的方法
2017-06-25 14:09
567 查看
本文主要介绍的是从手机中获取照片并且压缩后显示在imageview或者调用手机相机拍照之后压缩显示在imageView中,具有很好的参考意义,同时兼顾了Android7.0对于调用手机相机的设置问题。有需要的可以借鉴一下:
1.XML布局文件代码
2.Activity代码
在Activity代码的onCreate()函数中加入了以下几行:
错误信息如下图所示:
这个错误修改参考的是如下链接:http://blog.csdn.net/qq_23179075/article/details/70314473
这样,复制XML和Activity文件即可运行,实现对手机图片的获取和相机的调用
1.XML布局文件代码
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:id="@+id/imageView" android:adjustViewBounds="true" android:layout_gravity="center" android:minWidth="150dip" android:minHeight="150dip" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/btnPhone" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="相册" /> <Button android:id="@+id/btnTakePicture" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="拍照" /> </LinearLayout>
2.Activity代码
package com.apress.gerber.camera; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.StrictMode; import android.provider.MediaStore; import android.view.View; import android.widget.Button; import android.widget.ImageView; import java.io.ByteArrayOutputStream; import java.io.File; public class MainActivity extends Activity { private static final int NONE = 0; private static final int PHOTO_GRAPH = 1;// 拍照 private static final int PHOTO_ZOOM = 2; // 缩放 private static final int PHOTO_RESOULT = 3;// 结果 private static final String IMAGE_UNSPECIFIED = "image/*"; private ImageView imageView = null; private Button btnPhone = null; private Button btnTakePicture = null; private String change_path = "/peoplechanged"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView) findViewById(R.id.imageView); btnPhone = (Button) findViewById(R.id.btnPhone); btnPhone.setOnClickListener(onClickListener); btnTakePicture = (Button) findViewById(R.id.btnTakePicture); btnTakePicture.setOnClickListener(onClickListener); StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); builder.detectFileUriExposure(); } private final View.OnClickListener onClickListener = new View.OnClickLi 4000 stener() { @Override public void onClick(View v) { if(v==btnPhone){ //从相册获取图片 Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED); startActivityForResult(intent, PHOTO_ZOOM); }else if(v==btnTakePicture){ //从拍照获取图片 String filePath = Environment.getExternalStorageDirectory()+change_path; File localFile = new File(filePath); if (!localFile.exists()) { localFile.mkdir(); } Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory()+change_path ,"temp.jpg"))); startActivityForResult(intent, PHOTO_GRAPH); } } }; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == NONE) return; // 拍照 if (requestCode == PHOTO_GRAPH) { // 设置文件保存路径 String filePath = Environment.getExternalStorageDirectory()+change_path; File localFile = new File(filePath); if (!localFile.exists()) { localFile.mkdir(); } File picture = new File(Environment.getExternalStorageDirectory()+change_path + "/temp.jpg"); startPhotoZoom(Uri.fromFile(picture)); } if (data == null) return; // 读取相册缩放图片 if (requestCode == PHOTO_ZOOM) { startPhotoZoom(data.getData()); } // 处理结果 if (requestCode == PHOTO_RESOULT) { Bundle extras = data.getExtras(); if (extras != null) { Bitmap photo = extras.getParcelable("data"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); photo.compress(Bitmap.CompressFormat.JPEG, 75, stream);// (0-100)压缩文件 //此处可以把Bitmap保存到sd卡中 imageView.setImageBitmap(photo); //把图片显示在ImageView控件上 } } super.onActivityResult(requestCode, resultCode, data); } /** * 收缩图片 * * @param uri */ public void startPhotoZoom(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, IMAGE_UNSPECIFIED); intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 300); intent.putExtra("outputY", 500); intent.putExtra("return-data", true); startActivityForResult(intent, PHOTO_RESOULT); } }
在Activity代码的onCreate()函数中加入了以下几行:
// android 7.0系统解决拍照的问题 StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); builder.detectFileUriExposure();如果未加这几行,同时手机是Android7.0的话,会提示报错:
android.os.FileUriExposedException: file:///storage/emulated/0/photo.jpeg exposed beyond app through ClipData.Item.getUri()
错误信息如下图所示:这个错误修改参考的是如下链接:http://blog.csdn.net/qq_23179075/article/details/70314473
这样,复制XML和Activity文件即可运行,实现对手机图片的获取和相机的调用
相关文章推荐
- Android手机调用系统相机拍照、裁剪以及获取Url上传图片
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照以及从相册选择照片,剪裁
- Android调用手机拍照以及从相册选择照片
- H5调用手机的摄像头拍照上传以及手机相册选取照片但不支持Android的分析
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照功能的方法
- android 调用系统相册选取照片或者打开相机拍照获取图片,返回时回到手机桌面,然后才会跳转到当前activity
- android 调用系统相册选取照片或者打开相机拍照获取图片,返回时回到手机桌面,然后才会跳转到当前activity
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照以及从相册选择照片 不指定
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照以及从相册选择照片
- Android 调用系统相机拍照保存以及调用系统相册的方法
- 实现调用Android手机的拍照功能