如何将自定义应用添加至「从以下位置打开」菜单
实现自定义文件选择器式签名应用的方案
核心思路
要让你的应用成为调用应用的文件选择候选项,需让签名活动支持文件选择的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
相关产品推荐
相关产品推荐

