You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将自定义应用添加至「从以下位置打开」菜单

实现自定义文件选择器式签名应用的方案

核心思路

要让你的应用成为调用应用的文件选择候选项,需让签名活动支持文件选择的Intent协议,签名完成后直接将文件Uri返回给调用方,替代手动选择步骤。

具体实现步骤

1. 配置签名活动的Intent过滤器

在AndroidManifest.xml中给签名活动添加Intent过滤器,让系统识别你的应用为文件选择候选者,需支持ACTION_GET_CONTENT或ACTION_OPEN_DOCUMENT,并指定签名文件对应的MIME类型(比如图片类image/*):

<activity
    android:name=".SignBoardActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.GET_CONTENT" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.OPENABLE" />
        <data android:mimeType="image/*" />
    </intent-filter>
    <!-- 适配Android 4.4+文档访问框架,可选添加 -->
    <intent-filter>
        <action android:name="android.intent.action.OPEN_DOCUMENT" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.OPENABLE" />
        <data android:mimeType="image/*" />
    </intent-filter>
</activity>

2. 在签名活动中处理调用方Intent

启动签名活动时,获取调用方传递的Intent信息,确认是文件选择请求:

class SignBoardActivity : AppCompatActivity() {
    private var callerIntent: Intent? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sign_board)
        
        callerIntent = intent
    }
}

3. 签名完成后返回文件Uri给调用方

用户完成签名并保存文件后,通过FileProvider生成安全可共享的Uri,直接返回给调用应用,避免权限问题:

第一步:配置FileProvider

在AndroidManifest.xml中添加FileProvider配置:

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

在res/xml目录下创建file_paths.xml,指定签名文件的存储路径:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 若签名文件存在应用内部存储的signatures目录 -->
    <files-path name="signatures" path="signatures/" />
    <!-- 若存在外部存储,替换为以下配置 -->
    <!-- <external-files-path name="signatures" path="signatures/" /> -->
</paths>

第二步:生成Uri并返回

签名保存完成后,生成Uri并通过setResult返回给调用方:

// 假设signatureFile是已保存的签名文件
val signatureFile = File(filesDir, "signatures/user_sign.png")
// 生成可共享的安全Uri
val contentUri = FileProvider.getUriForFile(
    this,
    "${packageName}.fileprovider",
    signatureFile
)

// 授予调用方临时访问权限
callerIntent?.packageName?.let {
    grantUriPermission(
        it,
        contentUri,
        Intent.FLAG_GRANT_READ_URI_PERMISSION
    )
}

// 构建返回Intent并设置结果
val resultIntent = Intent().apply {
    data = contentUri
    addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
setResult(RESULT_OK, resultIntent)
finish()

4. 测试调用流程

在调用应用中,通过registerForActivityResult启动文件选择,你的应用会出现在候选列表中,签名完成后自动拿到返回的Uri:

val getContent = registerForActivityResult(GetContent()) { uri ->
    // 直接将Uri填入文件输入框
    binding.fileInput.setText(uri.toString())
}
// 启动文件选择,指定图片类型
getContent.launch("image/*")

内容的提问来源于stack exchange,提问作者mnunezdm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:20:22