android短視訊開發,呼叫相機、相簿,壓縮圖片後上傳
android短視訊開發,呼叫相機、相簿,壓縮圖片後上傳實現的相關程式碼
重寫webChromeClient的onShowFileChooser方法
@Override public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) { mUploadCallbackAboveL = filePathCallback; openAlbum(); return true; }
fileChooserParams可以接收h5中input標籤的一些引數,選擇好檔案後,將檔案uri傳遞給filePathCallback。
原文連結:呼叫原生相機、相簿
選擇呼叫相機或相簿
private void openAlbum() { // 指定拍照儲存位置的方式調起相機 String filePath = Environment.getExternalStorageDirectory() + File.separator + Environment.DIRECTORY_PICTURES + File.separator; String fileName = "IMG_" + DateFormat.format("yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA)) + ".jpg"; image = new File(filePath + fileName); imageUri = Uri.fromFile(image); Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); Intent Photo = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); Intent chooserIntent = Intent.createChooser(Photo, "選擇照片"); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Parcelable[]{captureIntent}); startActivityForResult(chooserIntent, REQUEST_CODE); }
通過imageUri儲存呼叫相機拍照的照片的儲存位置。用Intent開啟選擇相機、相簿或資料夾的activity。
接收選擇照片,或者拍照返回的uri
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE) { if (mUploadCallbackAboveL != null) { chooseAbove(resultCode, data); } else { Toast.makeText(this, "發生錯誤", Toast.LENGTH_SHORT).show(); } } }
choosAbove方法來處理獲取後的uri,並回傳給filePathCallback。
處理uri
具體的處理步驟,通過uri獲取到圖片的path,讀取圖片,壓縮圖片後重新儲存,將壓縮後的圖片uri進行回傳
(1). chooseAbove方法
private void chooseAbove(int resultCode, Intent data) { if (RESULT_OK == resultCode) { updatePhotos(); if (data != null) { // 處理選擇的照片 Uri[] results; Uri uriData = data.getData(); if (uriData != null) { results = new Uri[]{uriData}; try { Uri compressImageUri = ImageCompressUtils.compressBmpFromBmp(uriToString(uriData)); mUploadCallbackAboveL.onReceiveValue(new Uri[]{compressImageUri}); } catch (Exception e) { e.printStackTrace(); requestWritePermission(); } } else { mUploadCallbackAboveL.onReceiveValue(null); } } else { // 處理拍照的照片 try { Uri compressImageUri = ImageCompressUtils.compressBmpFromBmp(imageUri.getPath()); mUploadCallbackAboveL.onReceiveValue(new Uri[]{compressImageUri}); } catch (Exception e) { e.printStackTrace(); requestWritePermission(); } } } else { mUploadCallbackAboveL.onReceiveValue(null); } mUploadCallbackAboveL = null; }
由於拍照的照片儲存在imageUri,這裡將拍照和相簿選擇分開處理,注意,如果沒有選擇照片,給filePathCallback傳一個空值,防止上傳只能點選一次後失效。
(2). 壓縮圖片的工具類ImageCompressUtils
原文連結圖片壓縮工具類(解決了壓縮後圖片被旋轉的問題)
public class ImageCompressUtils { /** * @param srcPath * @return * @description 將圖片從本地讀到記憶體時,即圖片從File形式變為Bitmap形式 * 特點:通過設定取樣率,減少圖片的畫素,達到對記憶體中的Bitmao進行壓縮 * 方法說明: 該方法就是對Bitmap形式的圖片進行壓縮, 也就是通過設定取樣率, 減少Bitmap的畫素, 從而減少了它所佔用的記憶體 */ public static Uri compressBmpFromBmp(String srcPath) { // String srcPathStr = srcPath; BitmapFactory.Options newOptions = new BitmapFactory.Options(); newOptions.inJustDecodeBounds = true;//只讀邊,不讀內容 Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOptions); newOptions.inJustDecodeBounds = false; int w = newOptions.outWidth; int h = newOptions.outHeight; float hh = 800f; float ww = 480f; int be = 1; if (w > h && w > ww) { be = (int) (newOptions.outWidth / ww); } else if (w < h && h > hh) { be = (int) (newOptions.outHeight / hh); } if (be <= 0) be = 1; newOptions.inSampleSize = be;//設定取樣率 newOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;//該模式是預設的,可不設 newOptions.inPurgeable = true;//同時設定才會有效 newOptions.inInputShareable = true;//當系統記憶體不夠時候圖片會自動被回收 bitmap = BitmapFactory.decodeFile(srcPath, newOptions); int degree = readPictureDegree(srcPath); bitmap = rotateBitmap(bitmap, degree); return compressBmpToFile(bitmap); } /** * @param bmp * @description 將圖片儲存到本地時進行壓縮, 即將圖片從Bitmap形式變為File形式時進行壓縮, * 特點是: File形式的圖片確實被壓縮了, 但是當你重新讀取壓縮後的file為 Bitmap是,它佔用的記憶體並沒有改變 * 所謂的質量壓縮,即為改變其影像的位深和每個畫素的透明度,也就是說JPEG格式壓縮後,原來圖片中透明的元素將消失,所以這種格式很可能造成失真 */ public static Uri compressBmpToFile(Bitmap bmp) { String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/shoppingMall/compressImgs/"; File file = new File(path + System.currentTimeMillis() + ".jpg"); //判斷資料夾是否存在,如果不存在則建立資料夾 if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } ByteArrayOutputStream baos = new ByteArrayOutputStream(); int options = 80; bmp.compress(Bitmap.CompressFormat.JPEG, options, baos); while (baos.toByteArray().length / 1024 > 100) { baos.reset(); options -= 10; bmp.compress(Bitmap.CompressFormat.JPEG, options, baos); } try { FileOutputStream fos = new FileOutputStream(file); fos.write(baos.toByteArray()); fos.flush(); fos.close(); // copyExif(srcPathStr,file.getAbsolutePath()); // return file.getAbsolutePath(); return Uri.fromFile(file); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 獲取圖片旋轉角度 * * @param srcPath * @return */ private static int readPictureDegree(String srcPath) { int degree = 0; try { ExifInterface exifInterface = new ExifInterface(srcPath); int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: degree = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: degree = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: degree = 270; break; } } catch (IOException e) { e.printStackTrace(); } return degree; } //處理圖片旋轉 private static Bitmap rotateBitmap(Bitmap bitmap, int rotate) { if (bitmap == null) return null; int w = bitmap.getWidth(); int h = bitmap.getHeight(); // Setting post rotate to 90 Matrix mtx = new Matrix(); mtx.postRotate(rotate); return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true); } }
呼叫壓縮方法,將壓縮後的圖片的uri傳遞給filePathCallback,上傳結束。
以上就是 android短視訊開發,呼叫相機、相簿,壓縮圖片後上傳實現的相關程式碼,更多內容歡迎關注之後的文章
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69978258/viewspace-2848087/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 短視訊app開發,短視訊動態功能上傳圖片時,規定圖片壓縮的大小APP
- Android壓縮圖片後再上傳圖片Android
- 短視訊程式開發,Android:呼叫系統拍照和相簿Android
- js上傳圖片壓縮JS
- 短視訊平臺開發,將圖片、視訊儲存到本地的相簿中
- html5呼叫手機相機並壓縮、上傳HTML
- 微信小程式開發之從相簿獲取圖片 使用相機拍照 本地圖片上傳微信小程式地圖
- 短視訊平臺開發,圖片上傳和圖片預覽功能實現
- 前端圖片壓縮及上傳前端
- android短視訊開發,上傳視訊自動新增水印Android
- Android如何壓縮圖片上傳服務端Android服務端
- vue 上傳圖片進行壓縮圖片Vue
- 短視訊帶貨原始碼,儲存圖片到相簿/相簿原始碼
- Android本地圖片上傳(拍照+相簿)Android地圖
- Android上傳圖片之呼叫系統拍照和從相簿選擇圖片Android
- 短視訊開發,Android和JS互調實現圖片傳遞AndroidJS
- JS—圖片壓縮上傳(單張)JS
- Android 中圖片壓縮分析(上)Android
- python 開發一款圖片壓縮工具(四):上傳圖床Python圖床
- 前端的圖片壓縮image-compressor(可在圖片上傳前實現圖片壓縮)前端
- 如何使用FormData上傳壓縮裁剪後的圖片Blob物件ORM物件
- layui中實現上傳圖片壓縮UI
- Android中使用封裝的OKHttp上傳圖片,從相機和相簿中獲取圖片並剪下Android封裝HTTP
- 短視訊app開發,長按將視訊儲存到相簿APP
- 一個Vue圖片上傳剪裁壓縮元件Vue元件
- 【前端】壓縮圖片以及圖片相關概念前端
- android短視訊開發,點選靜態圖片自動跳轉播放視訊Android
- 短視訊直播原始碼,動態釋出時選擇圖片、上傳圖片原始碼
- 直播app開發搭建,Android studio 圖片壓縮APPAndroid
- android下圖片壓縮Android
- java後臺壓縮圖片Java
- ionic3 上傳圖片、壓縮圖片到阿里雲 服務端簽名後直傳阿里服務端
- android短影片開發,圖片視差滾動Android
- 適配Android4.4~Android11,呼叫系統相機,系統相簿,系統圖片裁剪,轉換檔案(對圖片進行上傳等操作)Android
- PbootCMS上傳圖片被壓縮怎麼解決boot
- 小視訊原始碼,java使用Thumbnails壓縮圖片原始碼JavaAI
- java,springboot + thymeleaf 上傳圖片、刪除圖片到伺服器、本地,壓縮圖片上傳(有些圖片會失真),原圖上傳JavaSpring Boot伺服器
- Android呼叫系統相簿和相機拍照Android