IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 近段时间的学习碎片整理(13) -> 正文阅读

[移动开发]近段时间的学习碎片整理(13)

1、一个很好用的权限框架

 implementation "com.github.permissions-dispatcher:permissionsdispatcher:4.9.1"
 kapt "com.github.permissions-dispatcher:permissionsdispatcher-processor:4.9.1"
@OnNeverAskAgain(
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
    )
    fun onOpenAlbumNeverAskAgain() {
        AlertDialog.Builder(this)
            .setCancelable(true)
            .setTitle(getString(R.string.tip))
            .setMessage(getString(R.string.close_write_read_permission_tip))
            .setNegativeButton(getString(R.string.cancel)) { _, _ ->

            }
            .setPositiveButton(getString(R.string.go_setting)) { _, _ ->
                PermissionUtils.startSystemIntent(this)
            }
            .create()
            .show()
    }

2、使用手机自带的相机拍照并获得结果(参考Android:调用系统相机实现拍照+裁切(兼容 7.0,11.0) - 简书

@NeedsPermission(
        Manifest.permission.CAMERA,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.READ_EXTERNAL_STORAGE
    )
    fun takePhotos() {
        imageFile = createImageFile()
        imageFile?.let {
            val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {  //如果是7.0以上,使用FileProvider,否则会报错
                intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
                imgUri = FileProvider.getUriForFile(this, AUTHORITY, it)
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imgUri) //设置拍照后图片保存的位置
            } else {
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(it)) //设置拍照后图片保存的位置
            }
            intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()) //设置图片保存的格式
            intent.resolveActivity(packageManager)?.let {
                activityResultLauncher.launch(intent) //调起系统相机
            }
        }
    }
  private var imageFile: File? = null
    private var imgUri: Uri? = null
    private val AUTHORITY = "com.transportation.camera.fileProvider" //FileProvider的签名(后面会介绍)
private val activityResultLauncher: ActivityResultLauncher<Intent> =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
 if (it.resultCode == Activity.RESULT_OK) {
                imgUri?.let {
                    i1 ->
                    val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
                    val savePath = "${getCacheFilePath(this)}/IMG_$timeStamp.jpg"
                    launch(Dispatchers.IO, {
                        val bitmap = getImage(FileUtil.getFilePathByUri(this@UploadActivity, i1))
                        Timber.d("savePath = $savePath")
                        bitmap?.let { b ->
                            saveBitmap(b, savePath)
                        }
                        withContext(Dispatchers.Main) {
                            imageUri.add(0, savePath)
                            uploadImageAdapter.notifyDataSetChanged()
                            if (imageUri.size > 1) {
                                binding.ivFinish.visibility = View.VISIBLE
                            }
                        }

                    }, { it2 ->
                        it2.printStackTrace()})

//                    imageUri.add(0 ,i1.toString())
                }
            }
}
  private fun saveBitmap(bitmap: Bitmap, path: String) {
        try {
            val file = File(path)
            if (!file.exists()) {
                file.getParentFile().mkdirs()
                file.createNewFile()
                val fos = FileOutputStream(file);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos)
                fos.flush()
                fos.close()
            }
        }catch (e: IOException) {
            e.printStackTrace()
            return;
        }
    }

    //根据路径获取用户选择的图片
    private fun getImage(imgPath: String): Bitmap? {
        val options = BitmapFactory.Options()
        options.inSampleSize = 2 //直接设置它的压缩率,表示1/2
        var b: Bitmap? = null
        try {
            val a = BitmapFactory.decodeFile(imgPath, options)
            val matrix = Matrix()
            a?.let {
                b = Bitmap.createBitmap(it, 0, 0, it.width, it.height, matrix, true)
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return b
    }

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-01 20:43:51  更:2022-02-01 20:44:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 16:34:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码