多媒体应用之简单拍摄照片
2017-10-17 10:38
162 查看
多媒体应用之简单拍摄照片
请求相机功能
如果拍照功能是应用的基本功能,需在manifest文件中添加标签:<manifest ...> <uses-feature android:name="android.hardware.camera" android:required="true"/> ... </manifest>
如果拍照功能不是必须的,设置required为false。此时,Google Play会允许无照相功能的手机下载应用。因此,代码中需调用hasSystemFeature(PackageManager.FEATURE_CAMERA)来检测手机是否具体照机功能。
调用拍照app
使用Intent调用拍照appstatic final int REQUEST_IMAGE_CAPTURE = 1; private void dispatchTakePictureIntent(){ Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if(takePictureIntent.resolveActivity(getPackageManager()) != null){ startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } }
resolveActivity()的功能是返回可以处理Intent的第一个activity组件,如果为null表示没有app可以处理请求,此时调用startActivityForResult()会导致应用崩溃。
获得缩略图
在onActivityResult中,Intent会传递一个小的Bitmap数据@Override protected void onActivityResult(int requestCode, int resultCode, Intent data){ if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK){ Bundle extras = data.getExtras(); Bitmap imageBitmap = (Bitmap)extras.get("data"); mImageView.setImageBitmap(imageBitmap); } }
保存完整图片
保存图片的文件可以使用getExternalStoragePublicDirectory( Environment .DIRECTORY_PICTURES).因此需要添加权限:<manifest ...> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ... </manifest>
如果图片仅仅是在应用中使用,可以使用getExternalFilesDir().Android 4.3以下需添加权限:
<manifest ...> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"/> ... </manifest>
注意:使用getExternalFilesDir()或getFilesDir()目录,在删除app时同时也会删除此目录。
文件名建议带有时间戳:
String mCurrentPhotoPath; private File createImageFile() throws IOException{ String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); File image = File.createTempFile(imageFileName,".jpg",storageDir); //带ACTION_VIEW的intents需要用到path mCurrentPhotoPath = image.getAbsolutePath(); return image; }
通过这个方法可以创建图片文件,现在创建和调用Intent:
static final int REQUEST_TAKE_PHOTO = 1; private void dispatchTakePictureIntent(){ Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //确保有相机应用来处理intent if(takePictureIntent.resolveActivity(getPackageManager()) != null){ File photoFile = null; try{ photoFile = createImageFile(); } catch (IOException ex){ //异常处理 } if(photoFile != null){ Uri photoURI = FileProvider.getUriForFile(this,"com.example.android.fileprovider",photoFile); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); } } }
使用getUriForFile(Context, String, File)会返回content://的URI,当Android版本为7.0或更高时,如果使用file://会导致FileUriExposedException异常。
配置FileProvider:
<application> ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.android.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data> </provider> ... </application>
确保authorities与getUriForFile(Context,String,File)一致。res/xml/file_paths.xml文件配置:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="my_images" path="Android/data/com.example.package.name/files/Pictures"/> </paths>
path要和getExternalFilesDir(Environment.DIRECTORY_PICTURES)返回的路径一致。com.example.package.name为应用实际的包名。
添加照片到相册
调用系统的媒体扫描器添加照片到Media Provider的数据库中,可以开发相册应用。private void galleryAddPic(){ Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); File f = new File(mCurrentPhotoPath); Uri contentUri = Uri.fromFile(f); mediaScanIntent.setData(contentUri); this.sendBroadcast(mediaScanIntent); }
解码缩放图片
private void setPic(){ //获得view的尺寸 int targetW = mImageView.getWidth(); int targetH = mImageView.getHeight(); //获得bitmap的尺寸 BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inJustDecodeBounds = true; BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); int photoW = bmOptions.outWidth; int photoH = bmOptions.outHeight; //决定怎样缩放图片 int scaleFactor = Math.min(photoW/targetW,photoH/targetH); bmOptions.inJustDecodeBounds = false; bmOptions.inSampleSize = scaleFactor; bmOptions.inPurgeable = true; Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath,bmOptions); mImageView.setImageBitmap(bitmap); }
相关文章推荐
- 13款用于拍摄全景照片的iOS应用
- 13款用于拍摄全景照片的iOS应用
- android 应用组件[通用 Intent---拍摄照片或视频并将其返回] 六
- Android 多媒体应用:开启摄像头、查看相册中的照片
- Android 多媒体应用:从相册选择照片显示(解决相册中图片显示不出来的问题)
- OpenfileDialog选择照片的简单应用
- Taking Photos Simply 简单地拍摄照片
- 多媒体应用之简单录像
- QT_PC学习_多媒体入门_简单场合应用
- Android里面多媒体的应用(简单的播放音乐和视频)
- Android开发_多媒体的简单应用
- PhotoShop制作简单的文字动画--多媒体技术与应用
- CountdownView 仿京东倒计时的简单应用
- Selenium简介(三)--基于RC的简单应用
- POJ 2492 A Bug's Life【并查集的简单应用同类的判断】
- Java中的异常处理机制的简单原理和应用以及连接池理解
- 简单的Asp和AJAX应用
- mybatis复杂应用的简单实例
- 字符串拷贝与进制转换的简单应用
- jsTree简单应用Demo