最近項(xiàng)目中用到修改用戶頭像的功能,基本上都是模板代碼,現(xiàn)在簡(jiǎn)單記錄一下.
private fun openCamera() { //調(diào)用相機(jī)拍照// 創(chuàng)建File對(duì)象,用于存儲(chǔ)拍照后的圖片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系統(tǒng)開始 使用本地真實(shí)的Uri路徑不安全,使用FileProvider封裝共享Uri //參數(shù)二:fileprovider絕對(duì)路徑 com.yaoli.testcamerademo:項(xiàng)目包名 imageUri = FileProvider.getUriForFile(this@MainActivity, "com.yaoli.testcamerademo.fileprovider", outputImage) } // 啟動(dòng)相機(jī)程序 val intent = Intent("android.media.action.IMAGE_CAPTURE") intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri) startActivityForResult(intent, 1) }
為了適配Android7.0以后的版本,需要在AndroidManifest配置一下(在后面相冊(cè)選圖也需要用到)
<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) // 打開相冊(cè),這種方式可以打開圖片或圖庫(kù)或文件管理中的圖片}
再來看下onActivityResult
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?
) {when (requestCode) {1 -> {
//拍照if (resultCode ==
AppCompatActivity.RESULT_OK) {startPhoneCrop(imageUri!!
)}}2 -> {
//打開相冊(cè)// 判斷手機(jī)系統(tǒng)版本號(hào)if (Build.VERSION.SDK_INT >= 21
) {// 4.4及以上系統(tǒng)使用這個(gè)方法處理圖片handleImageOnKitKat(data!!
)} else {// 4.4以下系統(tǒng)使用這個(gè)方法處理圖片handleImageBeforeKitKat(data!!
)}}
START_CROP_IMAGE_REQUEST -> {
if (resultCode == Activity.RESULT_OK) {
var file = File(outputUri!!.path)
}
} 其中涉及到一些系統(tǒng)裁剪相關(guān)的方法
/*** 調(diào)用系統(tǒng)裁剪的方法*/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
)//設(shè)置裁剪框高寬intent.putExtra("outputX", 150
)intent.putExtra("outputY", 150
)//返回?cái)?shù)據(jù)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及以上系統(tǒng)使用這個(gè)方法處理圖片 相冊(cè)圖片返回的不再是真實(shí)的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]
// 解析出數(shù)字格式的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來獲取真實(shí)的圖片路徑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)
轉(zhuǎn)載于:https://www.cnblogs.com/fuyaozhishang/p/9466258.html
總結(jié)
以上是生活随笔為你收集整理的Android调用系统拍照裁剪和选图功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。