欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 常用的 Intent 封装

程序员文章站 2024-03-16 18:45:46
...

本文链接: https://blog.csdn.net/xietansheng/article/details/115762956

1. 打开 Uri

import android.content.Context
import android.content.Intent
import android.net.Uri

fun openUri(context: Context, uri: Uri) {
    val intent = Intent()
    intent.action = Intent.ACTION_VIEW
    intent.data = uri
    context.startActivity(intent)   // 如果不支持的 Uri 将抛出异常
}

2. 打开 APP 在 设置 中的 应用信息

import android.content.Context
import android.content.Intent
import android.net.Uri
import android.provider.Settings

fun openAppDetails(context: Context, packageName: String) {
    val intent = Intent()
    intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
    intent.data = Uri.parse("package:$packageName")
    intent.addCategory(Intent.CATEGORY_DEFAULT)
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
    intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
    context.startActivity(intent)
}

3. 在 应用市场 中打开指定 APP

import android.content.Context
import android.content.Intent
import android.net.Uri

fun openAppMarket(context: Context, packageName: String) {
    val uri = "market://details?id=$packageName"
    val intent = Intent()
    intent.action = Intent.ACTION_VIEW
    intent.data = Uri.parse(uri)
    context.startActivity(intent)
}

4. 打开 APK 安装包

import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import androidx.core.content.FileProvider
import java.io.File

fun openInstallApk(context: Context, localApk: File) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        val intent = Intent()
        intent.action = Intent.ACTION_INSTALL_PACKAGE
        // AndroidManifest.xml 中配置的 <provider/> 节点的 android:authorities 属性值
        val authority = "${context.packageName}.fileprovider"
        val apkUri = FileProvider.getUriForFile(context, authority, localApk)
        intent.setDataAndType(apkUri, "application/vnd.android.package-archive")
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK )
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        context.startActivity(intent)
    } else {
        val intent = Intent()
        intent.action = Intent.ACTION_INSTALL_PACKAGE
        val apkUri = Uri.fromFile(localApk)
        intent.setDataAndType(apkUri, "application/vnd.android.package-archive")
        intent.addCategory(Intent.CATEGORY_DEFAULT)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        context.startActivity(intent)
    }
}

5. 发送通用的 文本 和 图片 分享

import android.content.Context
import android.content.Intent
import androidx.core.content.FileProvider
import java.io.File

fun sendTextShare(context: Context, text: String) {
    val intent = Intent()
    intent.action = Intent.ACTION_SEND
    intent.putExtra(Intent.EXTRA_TEXT, text)
    intent.type = "text/plain"
    context.startActivity(Intent.createChooser(intent,"发送至"))
}

fun sendImageShare(context: Context, localImage: File) {
    val intent = Intent()
    intent.action = Intent.ACTION_SEND
    intent.type = "image/*"
    // AndroidManifest.xml 中配置的 <provider/> 节点的 android:authorities 属性值
    val authority = "${context.packageName}.fileprovider"
    val contentUri = FileProvider.getUriForFile(context, authority, localImage)
    intent.putExtra(Intent.EXTRA_STREAM, contentUri)
    context.startActivity(Intent.createChooser(intent, "发送至"))
}

6. 打开系统的 图片 或 文件 选择器

import android.app.Activity
import android.content.Intent

fun openSystemImageChooser(context: Activity, requestCode: Int){
    val intent = Intent(Intent.ACTION_PICK)
    intent.type = "image/*"
    context.startActivityForResult(intent, requestCode)
}

fun openSystemFilesChooser(context: Activity, requestCode: Int) {
    val intent = Intent(Intent.ACTION_GET_CONTENT)
    intent.type = "*/*"
    intent.addCategory(Intent.CATEGORY_OPENABLE)
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)   // 支持多选
    context.startActivityForResult(Intent.createChooser(intent, "选择文件"), requestCode)
}

-------------------------------------------------------------------------------------

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity

class DemoActivity : AppCompatActivity() {
    /** 在 Activity 中重写 onActivityResult 获取选取的图片或文件 */
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == {打开选择器的ReqCode} && resultCode == RESULT_OK) {
            val uri = data?.data            // (单选)选取的图片或文件
            val clipData = data?.clipData   // (多选)选取的图片或文件
            ...
        }
    }
}

7. 打开系统相机拍照

import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.provider.MediaStore
import androidx.core.content.FileProvider
import java.io.File

fun openSystemCamera(activity: Activity, requestCode: Int, outputFile: File) {
    val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    val outputUri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        // AndroidManifest.xml 中配置的 <provider/> 节点的 android:authorities 属性值
        val authority = "${activity.packageName}.fileprovider"
        FileProvider.getUriForFile(activity, authority, outputFile)
    } else {
        Uri.fromFile(outputFile)
    }
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri)
    activity.startActivityForResult(intent, requestCode)
}