封装的图片选择工具,通过调用系统API实现,代码量少,侵入性低

package com.konstant.tool.lite.util

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Color
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Environment
import android.provider.MediaStore
import android.support.v4.content.FileProvider
import android.view.View
import android.view.WindowManager
import com.konstant.tool.lite.module.setting.SettingManager
import java.io.File

/**
 * 时间:2019/5/22 10:49
 * 创建:菜籽
 * 描述:封装的图片选择器,包含从系统图库获取图片以及从相机获取图片
 *      本选择器支持安卓4.0以上版本,同时针对安卓8.0的新特性做了适配工作
 *      本质上是启动了一个完全透明的activity,在内部对startActivityForResult进行了封装处理
 *
 * 接口如下:
 *      通过伴生接口,提供给外部的接口有三个:
 *      1、fun selectImg(context: Context, name: String, callback: (result: Boolean) -> Unit)
 *      2、fun takePhoto(context: Context, name: String, callback: (result: Boolean) -> Unit)
 *      3、fun clipPhoto(context: Context, name: String, callback: (result: Boolean) -> Unit)
 *      获取的图片一律存放在/storage/emulated/0/Android/包名/files/Pictures 下
 *      当接口回调为true时,表示图片已处理完毕,调用者可根据传过来的文件名字获取图片
 *      当接口回调false时,基本上用户手动取消了操作,调用者可根据此结果做响应处理
 */

class ImageSelector : Activity() {

    companion object {

        private val CAMERA_REQUEST = 1      // 拍照
        private val PHOTO_REQUEST = 2       // 相册
        private val PHOTO_CLIP = 3          // 裁剪

        private lateinit var mFileName: String

        lateinit var mCallback: ((result: Boolean) -> Unit)

        //  从相册选择图片,提供给外部的接口
        fun selectImg(context: Context, name: String, callback: (result: Boolean) -> Unit) {
            mCallback = callback
            mFileName = name
            with(Intent(context, ImageSelector::class.java)) {
                putExtra("type", PHOTO_REQUEST)
                flags = Intent.FLAG_ACTIVITY_NEW_TASK
                context.startActivity(this)
            }
        }

        //  调用摄像机拍摄图片,提供给外部的接口
        fun takePhoto(context: Context, name: String, callback: (result: Boolean) -> Unit) {
            mCallback = callback
            mFileName = name
            with(Intent(context, ImageSelector::class.java)) {
                putExtra("type", CAMERA_REQUEST)
                flags = Intent.FLAG_ACTIVITY_NEW_TASK
                context.startActivity(this)
            }
        }

        // 单独的调用系统裁剪图片的接口,这个接口一般很少单独使用,提供给外部的接口
        fun clipPhoto(context: Context, name: String, callback: (result: Boolean) -> Unit) {
            mCallback = callback
            mFileName = name
            with(Intent(context, ImageSelector::class.java)) {
                putExtra("type", PHOTO_CLIP)
                flags = Intent.FLAG_ACTIVITY_NEW_TASK
                context.startActivity(this)
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        invasionStatusBar(this)
        val type = intent.getIntExtra("type", 0)
        when (type) {
            CAMERA_REQUEST -> {
                val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
                val uri = FileUtil.getPictureUri(this, mFileName)
                intent.putExtra(MediaStore.EXTRA_OUTPUT, uri)
                startActivityForResult(intent, CAMERA_REQUEST)
            }
            PHOTO_REQUEST -> {
                with(Intent(Intent.ACTION_PICK)) {
                    setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*")
                    startActivityForResult(this, PHOTO_REQUEST)
                }
            }
            PHOTO_CLIP -> {
                val uri = FileUtil.getPictureUri(this, mFileName)
                clipPhoto(uri)
            }
        }
    }

    // 本activity调用系统的API获取数据后得到的结果,并对结果进行处理
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (resultCode != RESULT_OK) {
            mCallback.invoke(false)
            finish()
        }
        when (requestCode) {
            CAMERA_REQUEST -> {
                val file = File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), mFileName)
                if (!file.exists()) {
                    mCallback.invoke(false)
                    return
                }
                val uri = FileUtil.getPictureUri(this, mFileName)
                clipPhoto(uri)
            }
            PHOTO_REQUEST -> {
                data?.let { clipPhoto(it.data) }
            }
            PHOTO_CLIP -> {
                mCallback.invoke(true)
                finish()
            }
            else -> {
                mCallback.invoke(false)
                finish()
            }
        }
    }

    // 调用系统中自带的图片剪裁
    private fun clipPhoto(uri: Uri) {
        val cropPhoto = File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), mFileName)
        with(Intent("com.android.camera.action.CROP")) {
            setDataAndType(uri, "image/*")
            addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
            putExtra("crop", "true")
            putExtra("scale", true)

            putExtra("aspectX", 1)
            putExtra("aspectY", 1)

            //输出的宽高
            putExtra("outputX", 300)
            putExtra("outputY", 300)

            putExtra("return-data", false)
            putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cropPhoto))
            putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString())
            putExtra("noFaceDetection", true) // no face detection
            startActivityForResult(this, PHOTO_CLIP)
        }
    }

    // 隐藏系统的状态栏 以及 任务栏
    private fun invasionStatusBar(activity: Activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            val window = activity.window
            val decorView = window.decorView
            decorView.systemUiVisibility = (decorView.systemUiVisibility
                    or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    or View.SYSTEM_UI_FLAG_LAYOUT_STABLE)
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
            window.statusBarColor = Color.TRANSPARENT
        }
    }
}

activity的主题配置:

    <!--透明主题-->
    <style name="TransparentTheme" parent="@android:style/Theme.Translucent.NoTitleBar">
        <item name="android:windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@color/color_transport</item>
        <item name="android:windowDisablePreview">true</item>
    </style>

安卓8.0及以上,需要再清单文件中加入:

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

这是文件path配置:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="header_big.jpg"
        path="images/"/>
    <external-cache-path
        name="header_big.jpg"
        path="."/>
    <external-path
        name="header_big.jpg"
        path="."/>
</paths>

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值