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

如何为Android视频转音频应用添加分享接收入口?

Android应用接收跨应用视频分享实现方案

1. 配置Manifest让应用出现在分享列表

想让你的应用出现在其他App的分享列表里,得给某个Activity配置Intent Filter,声明它能接收视频分享请求。建议专门整个ShareReceiverActivity(也可以复用现有Activity),在AndroidManifest.xml里这么写:

<activity
    android:name=".ShareReceiverActivity"
    android:theme="@style/Theme.Transparent" <!-- 设成透明主题,用户看不到启动的界面 -->
    android:exported="true"> <!-- 必须开exported,允许其他App启动这个Activity -->
    <intent-filter>
        <!-- 接收单文件分享的Action -->
        <action android:name="android.intent.action.SEND" />
        <!-- 加DEFAULT类别才能出现在分享列表里 -->
        <category android:name="android.intent.category.DEFAULT" />
        <!-- 支持所有视频格式,也可以写具体的比如video/mp4 -->
        <data android:mimeType="video/*" />
    </intent-filter>
    <!-- 要是想支持多视频分享,就加下面这个Intent Filter -->
    <intent-filter>
        <action android:name="android.intent.action.SEND_MULTIPLE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="video/*" />
    </intent-filter>
</activity>

透明主题得在res/values/styles.xml里定义:

<style name="Theme.Transparent" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@null</item>
</style>

2. 处理接收的视频数据

在ShareReceiverActivity里,拿到分享过来的视频Uri,然后把转音频的活儿交给后台组件,之后立刻关掉Activity,用户就感觉没打开过App:

class ShareReceiverActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 处理分享的Intent
        intent?.let { handleShareIntent(it) }
        // 处理完直接关Activity
        finish()
    }

    private fun handleShareIntent(intent: Intent) {
        when (intent.action) {
            Intent.ACTION_SEND -> {
                val videoUri = intent.getParcelableExtra<Uri>(Intent.EXTRA_STREAM)
                videoUri?.let {
                    // 用WorkManager启动后台任务,比Service更适配新系统
                    val workRequest = OneTimeWorkRequestBuilder<VideoToAudioWorker>()
                        .setInputData(Data.Builder().putParcelable("VIDEO_URI", it).build())
                        .build()
                    WorkManager.getInstance(this).enqueue(workRequest)
                }
            }
            Intent.ACTION_SEND_MULTIPLE -> {
                val videoUris = intent.getParcelableArrayListExtra<Uri>(Intent.EXTRA_STREAM)
                videoUris?.let {
                    // 批量处理多个视频
                    val workRequest = OneTimeWorkRequestBuilder<VideoToAudioWorker>()
                        .setInputData(Data.Builder().putParcelableArrayList("VIDEO_URIS", it).build())
                        .build()
                    WorkManager.getInstance(this).enqueue(workRequest)
                }
            }
        }
    }
}

3. 后台处理视频转音频

用WorkManager来处理转码逻辑更稳妥,因为Android 8+对后台Service限制很严,WorkManager能保证任务在后台正常完成:

// 定义Worker类处理转码
class VideoToAudioWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
    override fun doWork(): Result {
        // 拿到视频Uri
        val videoUri = inputData.getParcelable<Uri>("VIDEO_URI")
        videoUri?.let {
            // 这里写你的视频转音频逻辑
            // 比如用MediaExtractor、MediaCodec,或者第三方库来实现
            convertVideoToAudio(it)
        }
        // 多视频处理可以类似获取VIDEO_URIS,循环处理
        return Result.success()
    }

    private fun convertVideoToAudio(videoUri: Uri) {
        // 你的转码代码实现
    }
}

4. 几个要注意的点

  • 权限问题:如果视频来自外部存储,Android 10以下要申请READ_EXTERNAL_STORAGE权限;Android 10+用Scoped Storage,不用申请这个权限,但要确保能正常访问Uri。
  • Uri兼容:分享的Uri可能是content://(来自媒体库)或者file://(来自文件管理器),转码逻辑要能处理这两种类型。
  • 后台适配:别用普通Service处理长时间任务,WorkManager是官方推荐的后台任务解决方案,能适配不同Android版本的后台限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:10:25