android中 拍照 視訊 錄音 顯示縮圖
阿新 • • 發佈:2019-02-10
1、拍照
/** * 處理拍照錄音 視訊的點選事件 * * @author 00 */ class MyOnClickLitener implements OnClickListener { @Override public void onClick(View v) { //申明意圖物件 Intent intent = null; //申明檔案要儲存的位置 File dir = null; switch (v.getId()) { case R.id.id_btn_take_photo: //初始化檔案儲存位置的物件 dir = new File(SDCardUtils.getRootDirectory()+ "/gdmsaec/picture/"); if (!dir.exists()) { //如果資料夾不存在 則建立 dir.mkdirs(); } //建立要儲存的檔案 photoFile = new File(dir.getAbsolutePath(), "IMG_"+ DateFormatUtils.getPVAFormatDate() + ".jpg"); // 開啟系統相機 intent = new Intent(); //此句程式碼 代表拍照成功之後 直接儲存拍照之後的圖片到sdcad中的檔案中 這樣檔案的質量是最好的 最清晰的 intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photoFile)); //設定開啟系統相機的意圖action intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); //開啟相機 startActivityForResult(intent, Constants.OPEN_CAMERA); break; case R.id.id_btn_aideo:// 錄音 intent = new Intent(); //設定開啟錄音的意圖action intent.setAction(Media.RECORD_SOUND_ACTION); startActivityForResult(intent, Constants.OPEN_AIDEO); break; case R.id.id_btn_video:// 視訊 //申明視訊檔案需要儲存的資料夾 dir = new File(SDCardUtils.getRootDirectory()+ "/gdmsaec/video/"); if (!dir.exists()) { dir.mkdirs(); } intent = new Intent(); //初始化視訊檔案的名字 videoFile = new File(dir.getAbsoluteFile(), "VID_"+ DateFormatUtils.getPVAFormatDate() + ".3gp"); //此句程式碼 標識 視訊錄製成功後 直接儲存到手機sdcrad中 以上面宣告的檔名 命名 intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(videoFile)); //設定開啟視訊錄製的action intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE); startActivityForResult(intent, Constants.OPEN_VIDEO); break; case R.id.id_btn_upload: // 開啟系統相簿 intent = new Intent(); //過濾 選擇的相簿是所有型別的 intent.setType("image/*"); //設定action intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, Constants.OPEN_XIANGCE); break; } } }
2、拍照 視訊 錄音 成功時候的呼叫的方法
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //當用戶拍照 錄音 視訊 完成之後呼叫此方法 //這裡說明一下 如果之前在啟動是設定 intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(file));那麼這裡的data是獲取不到返回的值得 super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { switch (requestCode) { case CAMERA: cameraPopupWindow.dismiss(); alertDialog(0,"拍照成功,是否上傳至伺服器?", photoFile); break; case VIDEO: cameraPopupWindow.dismiss(); alertDialog(1,"錄製成功,是否上傳至伺服器?", videoFile); break; case AUDIO://錄音檔案需要特殊處理一下 Uri audioUri = data.getData(); // String aa = Util.getPath(this, audioUri); // File fileAudio = new File(aa); // fileAudio.delete(); try { AssetFileDescriptor descriptor = getContentResolver().openAssetFileDescriptor(audioUri, "r"); FileInputStream fis = descriptor.createInputStream(); File path = new File(SDCardUtils.getRootDirectory()+ "/gdmsaec/aideo/"); if (!path.exists()) { path.mkdirs(); } audioFile = new File(path.getAbsolutePath(), "AID_"+ DateFormatUtils.getPVAFormatDate() + ".amr"); FileOutputStream fos = new FileOutputStream(audioFile); byte[] buffer = new byte[1024]; int len = 0; while ((len = (fis.read(buffer))) != -1) { fos.write(buffer, 0, len); } fis.close(); fos.close(); } catch (Exception e) { //ToastUtils.showToast(mainActivity, e.getMessage()); } cameraPopupWindow.dismiss(); alertDialog(2,"錄製成功,是否上傳至伺服器?", audioFile); break; case XIANGCE: cameraPopupWindow.dismiss(); Uri uri = data.getData(); String path = Util.getPath(this, uri); photoFile = new File(path); // Bitmap bitmap = BitmapFactory.decodeFile(path); alertDialog(3,"照片已選中,是否上傳至伺服器?", photoFile); break; } } }
3、對話方塊提示
/** * 彈出是否上傳檔案的對話方塊 * * @param str */ private void alertDialog(int i , String str, final File file) { Bitmap bitmap =null; if(i == 0){ //拍照 獲取縮圖 bitmap = BitmapUtils.getImageThumbnail(file.getAbsolutePath(), 200, 200); }else if(i == 1){ //獲取視訊的縮圖 bitmap = BitmapUtils.getVideoThumbnail(file.getAbsolutePath(), 200, 200, Thumbnails.MINI_KIND); } DialogUtils.showDialog2(mainActivity, "溫馨提示", bitmap, str,new DialogOnClickListenner() { @Override public void btnConfirmClick(Dialog dialog) { dialog.dismiss(); uploadFile(file); } @Override public void btnCancelClick(Dialog dialog) { dialog.dismiss(); } }); }
4、獲取縮圖的工具類
public class BitmapUtils {
/**
* 根據指定的影象路徑和大小來獲取縮圖 此方法有兩點好處: 1.
* 使用較小的記憶體空間,第一次獲取的bitmap實際上為null,只是為了讀取寬度和高度,
* 第二次讀取的bitmap是根據比例壓縮過的影象,第三次讀取的bitmap是所要的縮圖。 2.
* 縮圖對於原影象來講沒有拉伸,這裡使用了2.2版本的新工具ThumbnailUtils,使 用這個工具生成的影象不會被拉伸。
*
* @param imagePath
* 影象的路徑
* @param width
* 指定輸出影象的寬度
* @param height
* 指定輸出影象的高度
* @return 生成的縮圖
*/
public static Bitmap getImageThumbnail(String imagePath, int width,
int height) {
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
// 獲取這個圖片的寬和高,注意此處的bitmap為null
bitmap = BitmapFactory.decodeFile(imagePath, options);
options.inJustDecodeBounds = false; // 設為 false
// 計算縮放比
int h = options.outHeight;
int w = options.outWidth;
int beWidth = w / width;
int beHeight = h / height;
int be = 1;
if (beWidth < beHeight) {
be = beWidth;
} else {
be = beHeight;
}
if (be <= 0) {
be = 1;
}
options.inSampleSize = be;
// 重新讀入圖片,讀取縮放後的bitmap,注意這次要把options.inJustDecodeBounds 設為 false
bitmap = BitmapFactory.decodeFile(imagePath, options);
// 利用ThumbnailUtils來建立縮圖,這裡要指定要縮放哪個Bitmap物件
bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
return bitmap;
}
/**
* 獲取視訊的縮圖 先通過ThumbnailUtils來建立一個視訊的縮圖,然後再利用ThumbnailUtils來生成指定大小的縮圖。
* 如果想要的縮圖的寬和高都小於MICRO_KIND,則型別要使用MICRO_KIND作為kind的值,這樣會節省記憶體。
*
* @param videoPath
* 視訊的路徑
* @param width
* 指定輸出視訊縮圖的寬度
* @param height
* 指定輸出視訊縮圖的高度度
* @param kind
* 參照MediaStore.Images.Thumbnails類中的常量MINI_KIND和MICRO_KIND。
* 其中,MINI_KIND: 512 x 384,MICRO_KIND: 96 x 96
* @return 指定大小的視訊縮圖
*/
public static Bitmap getVideoThumbnail(String videoPath, int width, int height,
int kind) {
Bitmap bitmap = null;
// 獲取視訊的縮圖
bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, kind);
System.out.println("w" + bitmap.getWidth());
System.out.println("h" + bitmap.getHeight());
bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
return bitmap;
}
}