如何为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
相关产品推荐
相关产品推荐

