Android类似微信聊天页面教程(Kotlin)五——选择发送图片

这篇具有很好参考价值的文章主要介绍了Android类似微信聊天页面教程(Kotlin)五——选择发送图片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android类似微信聊天页面教程(Kotlin)五——选择发送图片

 

前提条件

安装并配置好Android Studio

Android Studio Electric Eel | 2022.1.1 Patch 2
Build #AI-221.6008.13.2211.9619390, built on February 17, 2023
Runtime version: 11.0.15+0-b2043.56-9505619 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Windows 11 10.0
GC: G1 Young Generation, G1 Old Generation
Memory: 1280M
Cores: 6
Registry:
    external.system.auto.import.disabled=true
    ide.text.editor.with.preview.show.floating.toolbar=false
    ide.balloon.shadow.size=0
 
Non-Bundled Plugins:
    com.intuit.intellij.makefile (1.0.15)
    com.github.setial (4.0.2)
    com.alayouni.ansiHighlight (1.2.4)
    GsonOrXmlFormat (2.0)
    GLSL (1.19)
    com.mistamek.drawablepreview.drawable-preview (1.1.5)
    com.layernet.plugin.adbwifi (1.0.5)
    com.likfe.ideaplugin.eventbus3 (2020.0.2)

gradle-wrapper.properties

#Tue Apr 25 13:34:44 CST 2023
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

build.gradle(:Project)

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id 'com.android.application' version '7.3.1' apply false
    id 'com.android.library' version '7.3.1' apply false
    id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
}


setting.gradle

pluginManagement {
    repositories {
        maven { url 'https://maven.aliyun.com/repository/public' }
        google()
        mavenCentral()
        gradlePluginPortal()
        maven { url 'https://jitpack.io' }
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven { url 'https://maven.aliyun.com/repository/public' }
        google()
        mavenCentral()
        gradlePluginPortal()
        maven { url 'https://jitpack.io' }
    }
}
rootProject.name = "FeChat"
include ':app'


build.gralde(:app)

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'

    id 'kotlin-android'
    id 'kotlin-kapt'
}

android {
    namespace 'com.example.fechat'
    compileSdk 33

    defaultConfig {
        applicationId "com.example.fechat"
        minSdk 26
        targetSdk 33
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies {

    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.8.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation 'androidx.cardview:cardview:1.0.0'
    implementation("androidx.activity:activity-ktx:1.7.1")

    // 沉浸式状态栏 https://github.com/gyf-dev/ImmersionBar
    implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
    implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' // fragment快速实现(可选)
    implementation 'com.gyf.immersionbar:immersionbar-ktx:3.0.0' // kotlin扩展(可选)
    implementation 'com.google.code.gson:gson:2.8.9'

    implementation "androidx.room:room-runtime:2.4.2"
    implementation "androidx.room:room-ktx:2.4.2"
    kapt "androidx.room:room-compiler:2.4.2"
    implementation 'org.apache.commons:commons-csv:1.5'
    implementation 'com.permissionx.guolindev:permissionx:1.4.0'
    implementation 'com.blankj:utilcodex:1.30.0' // 无
    implementation 'com.github.bumptech.glide:glide:4.12.0'
    kapt 'com.github.bumptech.glide:compiler:4.12.0'
    implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.3'
    implementation 'com.github.li-xiaojun:XPopup:latest.release'
}


对Kotlin语言有基本了解

内容在前一篇博客中写了基础配置,如果本篇内容看不懂,可以先去上一篇。

使用 Jetpack activity 协定

为了简化照片选择器的集成,请添加 1.7.0 版或更高版本的 androidx.activity 库。

您可以使用以下 activity 结果协定来启动照片选择器:

  • PickVisualMedia,用于选择单张图片或单个视频。
  • PickMultipleVisualMedia,用于选择多张图片或多个视频。

如果照片选择器在设备上不可用,该库会自动调用 ACTION_OPEN_DOCUMENT intent 操作。搭载 Android 4.4(API 级别 19)或更高版本的设备支持此 intent。您可以通过调用 isPhotoPickerAvailable() 来验证照片选择器在给定设备上是否可用。

图片选择

照片选择器提供了一个可浏览、可搜索的界面,其中按日期(从最近到最早)顺序向用户呈现其媒体库中的文件。您可以指定用户只能看到照片或只能看到视频,并且默认情况下,允许的媒体选择量上限设置为 1

单图选择器

ActivityResultContracts.PickVisualMedia()

多图选择器

ActivityResultContracts.PickMultipleVisualMedia("自定义选择上限")

平台会限制您可以让用户在照片选择器中选择的文件数量上限。如需访问此限制,请调用 getPickImagesMaxLimit()。 在不支持照片选择器的设备上,系统会忽略此上限。

注意:如果照片选择器不可用,且支持库调用 ACTION_OPEN_DOCUMENT intent 操作,则系统会忽略指定的可选媒体文件数量上限。

适用的设备

照片选择器适用于符合以下条件的设备:

  • 搭载 Android 11(API 级别 30)或更高版本
  • 通过 Google 系统更新接收对模块化系统组件的更改

搭载 Android 4.4(API 级别 19)到 Android 10(API 级别 29)的旧款设备,以及搭载 Android 11 或 12 且支持 Google Play 服务的 Android Go 设备,都可以安装向后移植的照片选择器版本。如需通过 Google Play 服务自动安装向后移植的照片选择器模块,请将以下条目添加到应用清单文件的 <application> 标记中:

<!-- Trigger Google Play services to install the backported photo picker module. -->
<service android:name="com.google.android.gms.metadata.ModuleDependencies"
         android:enabled="false"
         android:exported="false">
    <intent-filter>
        <action android:name="com.google.android.gms.metadata.MODULE_DEPENDENCIES" />
    </intent-filter>
    <meta-data android:name="photopicker_activity:0:required" android:value="" />
</service>

保留媒体文件访问权限

默认情况下,系统会授予应用对媒体文件的访问权限,直到设备重启或应用停止运行。如果您的应用执行长时间运行的工作(例如在后台上传大型文件),您可能需要将此访问权限保留更长时间。为此,请调用 takePersistableUriPermission() 方法:

val flag = Intent.FLAG_GRANT_READ_URI_PERMISSION
context.contentResolver.takePersistableUriPermission(uri, flag)

实现方案

根据官方文档介绍,于是有了以下的初始化方式(此处在context的create生命周期中调用):

private var media: ActivityResultLauncher<PickVisualMediaRequest>? = null
fun initPicker(
    activity: AppCompatActivity,
    maxFiles: Int = 1,
    listener: PickFileResultListener
) {
    val contract = if (maxFiles == 1)
        ActivityResultContracts.PickVisualMedia()
    else
        ActivityResultContracts.PickMultipleVisualMedia(
            maxFiles
        )
    media =
        activity.registerForActivityResult(contract) { uri ->
            if (uri != null) {
                val uris = uri.toString().substring(1, uri.toString().length - 1).split(",")
                listener.onPick(uris)
                Log.e("PhotoPicker", "Selected URI: $uris")
            } else {
                Log.e("PhotoPicker", "No media selected")
            }
        }
}

选择回调监听器

interface PickFileResultListener {
    fun onPick(uris: List<String>)
}

调用如下

fun pickMedia(fileType: String) {
    media?.launch(
        PickVisualMediaRequest(
            ActivityResultContracts.PickVisualMedia.SingleMimeType(
                fileType
            )
        )
    )
}

其中选择类型定义为:

const val PICK_IMAGE_VIDEO = "*/*"
const val PICK_IMAGE = "image/*"
const val PICK_VIDEO = "video/*"
const val PICK_GIF = "image/gif"

转化路径

这样得到的Uri如果想要使用,需要先转化为绝对路径

fun Uri2Path(context: Context, uri: Uri?): String? {
    if (uri == null) {
        return null
    }
    if (ContentResolver.SCHEME_FILE == uri.scheme) {
        return uri.path
    } else if (ContentResolver.SCHEME_CONTENT == uri.scheme) {
        val authority: String = uri.authority!!
        if (authority.startsWith("com.android.externalstorage")) {
            return "${Environment.getExternalStorageDirectory()}/${
                uri.path?.split(":")?.get(1)
            }"
        } else {
            try {
                var idStr = ""
                if (authority == "media") {
                    idStr = uri.toString().substring(uri.toString().lastIndexOf('/') + 1)
                } else if (authority.startsWith("com.android.providers")) {
                    idStr = DocumentsContract.getDocumentId(uri).split(":".toRegex())
                        .dropLastWhile { it.isEmpty() }
                        .toTypedArray()[1]
                }
                val contentResolver = context.contentResolver
                val cursor: Cursor? = contentResolver.query(
                    MediaStore.Files.getContentUri("external"),
                    arrayOf(MediaStore.Files.FileColumns.DATA),
                    "_id=?",
                    arrayOf(idStr),
                    null
                )
                if (cursor != null) {
                    cursor.moveToFirst()
                    val idx: Int = cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA)
                    val path = cursor.getString(idx)
                    cursor.close()
                    return path
                }
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }
    return null
}

大图预览

预览框架采用XPopup

需要添加依赖文章来源地址https://www.toymoban.com/news/detail-437840.html

implementation 'com.github.li-xiaojun:XPopup:latest.release'
private fun showImageView(imageView: ImageView, currentPosition: Int) {
    XPopup.Builder(context)
        .isDestroyOnDismiss(true)
        .asImageViewer(
            imageView, currentPosition, uris,
            { popupView, position ->
                /*Toast.makeText(
                    context, "切换到第" + position + "个图片", Toast.LENGTH_SHORT
                ).show()*/
            },
            SmartGlideImageLoader(R.mipmap.ic_launcher)
        )
        .show()
}

到了这里,关于Android类似微信聊天页面教程(Kotlin)五——选择发送图片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序实现页面数据侦听器,类似vue的watch

    既然小程序的组件已经有Observer功能,那为什么还要手写watch功能呢? Observer只能在Component中使用,没法在Page中使用。若是想在Page中监控某一数据的变化,Observer做不到。 Observer属于小程序的新功能,只能在高版本微信使用,低版本微信无法使用。公司的小程序就因为使用了

    2024年02月03日
    浏览(56)
  • Android 安卓开发语言kotlin与Java该如何选择

            如今在Android开发中,应用层开发语言主要是Java和Kotlin,Kotlin是后来加入的,主导的语言还是Java。kotlin的加入仿佛让会kotlin语言的开发者更屌一些,其实不然。         有人说kotlin的引入是解决开发者复杂的逻辑,并且对空指针控制的比较友好,但是我们在开

    2024年02月11日
    浏览(61)
  • Android跳转到QQ加群、聊天页面

    1.跳转到QQ聊天页面(单聊) 2.跳转到QQ群页面 在跳转到QQ群页面前,需要先获取要跳转到QQ群的Key,获取Key的网址:https://qun.qq.com/join.html 电脑 加群的 链接, 是 扫描 群的 二维码 图片 可以 得到 点击, 手机里打不开

    2024年02月04日
    浏览(44)
  • 【微信小程序】客服系统,客服聊天发送商品详情,快捷发送链接和图文消息,附代码和流程

    遇到一个新需求,需要做一个客服聊天的功能能够发送链接和图文消息,先在小程序后台做一个配置,首先在后台添加客服 然后客服按钮编写,功能实现 小程序客服创建 按钮编写可以参考微信开放文档 客服按钮, button 的 open-type 要设置为 contact

    2024年02月10日
    浏览(64)
  • uniapp微信小程序 选择聊天记录文件上传

    目录 精简版总结 示例 容易踩的坑 1、页面刷新问题 2、extension问题 单文件 多个文件 PS:files和filePath/name只能二选一组 此处用xlsx文件作实例,选择聊天记录中的xlsx文件上传到指定接口中。 因为某些微信版本extension可能不生效,或者又想要对提交的文件名做校验,建议参考我

    2024年02月09日
    浏览(82)
  • 微信小程序做类似vue的级联选择功能,使用picker-view-column+checkbox-group完成

    直接上图 主要代码 #wxml  picker-view class=\\\"bj\\\" indicator-style=\\\"height: 50px;\\\"  value=\\\"{ {value}}\\\" bindchange=\\\"bindChange\\\"       picker-view-column         view wx:for=\\\"{ {typeshool}}\\\" bindtap=\\\"onclack\\\" mark:id=\\\"{ {item.classifyId}}\\\"  wx:key=\\\"index\\\" style=\\\"line-height: 50px; text-align: center;\\\" checkbox-group class=\\\"

    2024年02月09日
    浏览(39)
  • android studio创建一个新的项目为什么默认是kotlin语言而选择不了java语言

    关于android studio语言选择的问题。 我在进入android studio为什么创建一个新项目之后选择不了java语言有什么办法可以解决。 解决办法:这个模式下选着一个Empty Activity模块就可以使用java语言。 这对于刚刚接触anaroid studio新手比较管用。  

    2024年02月11日
    浏览(56)
  • 微信小程序 表单 选择跳转新页面,选择后,返回上一页面保留原页面已填写的值

    场景: 表单页有很多项需要填写,个别项数据较多,需要跳转到新的页面去选择后,带着结果返回。如图。 此时,想要返回时,已经填写过的内容保留不变,不被清空。 解决: 在下一页去获取上一页data中的数据,并修改,再通过 wx.navigateBack({ delta: 1, }) 返回上一页,页面不

    2024年02月12日
    浏览(40)
  • 微信小程序web-view嵌入uni-app H5页面,通过H5页面跳转企业微信客户聊天窗口如何操作?

    1)找到企业ID,登录 企业微信 企业微信 https://work.weixin.qq.com/wework_admin/loginpage_wx  2)找到接入链接  功能-客服-微信客服 微信公众平台,给个人、企业和组织提供业务服务与用户管理能力的全新服务平台。 https://mp.weixin.qq.com/

    2024年02月11日
    浏览(63)
  • Android Studio Kotlin 简单实现微信主界面UI

                            windows11                         文件版本 2023.2.0.0                         产品版本 2023.2.0.AI-232.10227.8.2321._BUILD_NUMBER_         JAVA属性:                          java version \\\"17.0.10\\\" 2024-01-16 LTS       

    2024年04月16日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包