日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Android调用系统拍照裁剪和选图功能

發布時間:2023/12/2 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android调用系统拍照裁剪和选图功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近項目中用到修改用戶頭像的功能,基本上都是模板代碼,現在簡單記錄一下.

  • 調用系統拍照
private fun openCamera() { //調用相機拍照// 創建File對象,用于存儲拍照后的圖片var outputImage = File(externalCacheDir, "output_image.jpg")try {if (outputImage.exists()) {outputImage.delete()}outputImage.createNewFile()} catch (e: IOException) {e.printStackTrace()}if (Build.VERSION.SDK_INT < 24) {imageUri = Uri.fromFile(outputImage) } else { //Android 7.0系統開始 使用本地真實的Uri路徑不安全,使用FileProvider封裝共享Uri //參數二:fileprovider絕對路徑 com.yaoli.testcamerademo:項目包名 imageUri = FileProvider.getUriForFile(this@MainActivity, "com.yaoli.testcamerademo.fileprovider", outputImage) } // 啟動相機程序 val intent = Intent("android.media.action.IMAGE_CAPTURE") intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri) startActivityForResult(intent, 1) }

為了適配Android7.0以后的版本,需要在AndroidManifest配置一下(在后面相冊選圖也需要用到)

<application>... <providerandroid:name="android.support.v4.content.FileProvider"android:authorities="com.yaoli.testcamerademo.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> </application>

其中的?file_paths是這樣的

?

  • 調用系統相冊
private fun pickPhoto() {val intent = Intent("android.intent.action.GET_CONTENT")intent.type = "image/*"
      startActivityForResult(Intent.createChooser(intent,"Select Picture"), 2) // 打開相冊,這種方式可以打開圖片或圖庫或文件管理中的圖片
}

再來看下onActivityResult

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {when (requestCode) {1 -> {//拍照if (resultCode == AppCompatActivity.RESULT_OK) {startPhoneCrop(imageUri!!)}}2 -> {//打開相冊// 判斷手機系統版本號if (Build.VERSION.SDK_INT >= 21) {// 4.4及以上系統使用這個方法處理圖片handleImageOnKitKat(data!!)} else {// 4.4以下系統使用這個方法處理圖片handleImageBeforeKitKat(data!!)}}
    START_CROP_IMAGE_REQUEST -> {
  if (resultCode == Activity.RESULT_OK) {
var file = File(outputUri!!.path)
    } }

其中涉及到一些系統裁剪相關的方法

  • 調用系統裁剪
/*** 調用系統裁剪的方法*/private fun startPhoneCrop(uri: Uri) {outputUri = Uri.fromFile(File(Environment.getExternalStorageDirectory().absolutePath + "/" + System.currentTimeMillis() + ".jpg"))val intent = Intent("com.android.camera.action.CROP")if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)}intent.setDataAndType(uri, "image/*")//是否可裁剪intent.putExtra("corp", "true")intent.putExtra("scale", true)//裁剪器高寬比intent.putExtra("aspectY", 1)intent.putExtra("aspectX", 1)//設置裁剪框高寬intent.putExtra("outputX", 150)intent.putExtra("outputY", 150)//返回數據intent.putExtra("return-data", false)intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri)intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString())startActivityForResult(intent, START_CROP_IMAGE_REQUEST)} // 4.4及以上系統使用這個方法處理圖片 相冊圖片返回的不再是真實的Uri,而是分裝過的Uri@TargetApi(21)private fun handleImageOnKitKat(data: Intent) {var imagePath = ""val uri: Uri = data.dataif (DocumentsContract.isDocumentUri(this, uri)) {// 如果是document類型的Uri,則通過document id處理val docId = DocumentsContract.getDocumentId(uri)if ("com.android.providers.media.documents" == uri.authority) {val id = docId.split(":")[1] // 解析出數字格式的idval selection = MediaStore.Images.Media._ID + "=" + idimagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection)} else if ("com.android.providers.downloads.documents" == uri.authority) {val contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), docId.toLong())imagePath = getImagePath(contentUri, null)}} else if ("content".equals(uri.scheme, true)) {// 如果是content類型的Uri,則使用普通方式處理imagePath = getImagePath(uri, null)} else if ("file".equals(uri.scheme, true)) {// 如果是file類型的Uri,直接獲取圖片路徑即可imagePath = uri.path}val imgUri = FileProvider.getUriForFile(applicationContext, "com.yaoli.example.fileprovider", File(imagePath))startPhoneCrop(imgUri)}private fun handleImageBeforeKitKat(data: Intent) {val uri = data.dataval imagePath = getImagePath(uri, null)val imgUri: Uri = Uri.fromFile(File(imagePath))startPhoneCrop(imgUri)}

private fun getImagePath(uri: Uri, selection: String?): String {var path = ""// 通過Uri和selection來獲取真實的圖片路徑val cursor = contentResolver.query(uri, null, selection, null, null)if (cursor != null) {if (cursor.moveToFirst()) {path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)) } cursor.close() } return path } ?

裁剪之后的返回也在onActivityResult方法中.

?

startActivityForResult(Intent.createChooser(intent, "Select Picture"), 2)

轉載于:https://www.cnblogs.com/fuyaozhishang/p/9466258.html

總結

以上是生活随笔為你收集整理的Android调用系统拍照裁剪和选图功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。