关于 Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_

本文介绍在Android4.4上进行图片扫描功能开发时遇到的权限问题及解决方案。由于系统限制,非系统应用直接发送广播通知扫描SD卡会报错。文章提供了一种替代方案来避免此权限问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于 Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED from 错误原因
当在Android4.4上进行图片的扫描功能开发时一般会使用:sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory()+ picPath)));的广播
但因为Android4.4中限制了系统应用才有权限使用广播通知系统扫描SD卡,所以会报上面的错误。


this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
<think>首先,用户的问题是:“请问adb shell am start android.intent.action.MAIN Permission Denial not exported”。这似乎是关于在使用ADB命令启动Activity时遇到权限拒绝错误,具体提示"Permission Denial: not exported"。 回顾系统指令: - 所有行内数学表达式用$...$格式。 - 独立公式用$$...$$格式。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 用户的问题是基于引用内容,这些引用描述了类似错误: - 引用[1]:当Activity的exported属性为false时,尝试启动会报错"Permission Denial: not exported",解决方案是设置exported为true。 - 引用[2]:类似错误,在启动Activity时发生权限拒绝,因为Activity未导出。 - 引用[3]:提到添加action属性来解决权限问题。 用户的具体命令是:adb shell am start android.intent.action.MAIN,但错误是"Permission Denial not exported",表明尝试启动的Activity没有导出。 关键点: - ADB命令:adb shell am start -W <package>/<activity> 用于启动Activity并测量启动时间。 - 错误原因:如果Activity在AndroidManifest.xml中没有设置android:exported="true",或者没有适当的intent-filter,它不能被外部应用(包括ADB)启动。 在用户的问题中,命令是"adb shell am start android.intent.action.MAIN",这看起来不完整。通常,完整的命令应该指定包名和Activity类名,或使用Intent action。 标准命令格式: - 使用显式Intent:adb shell am start -n <package>/<fully qualified activity class name> - 使用隐式Intent:adb shell am start -a <action> -c <category> -d <data> 等。 用户指定了action: android.intent.action.MAIN,但没有指定包名或组件。这可能导致系统尝试启动具有该action的Activity,但如果没有导出,就会报错。 解决方案: 1. 确保目标Activity在AndroidManifest.xml中设置了android:exported="true"。 2. 或者,添加一个intent-filter,使Activity可以被隐式启动。 3. 使用显式Intent指定包名和类名。 在引用[1]中,解决方案是将exported设为true;在引用[3]中,添加action属性。 现在,构建回答: - 用中文回答。 - 结构清晰:解释问题、原因、解决方案。 - 生成相关问题。 - 添加引用标识。 回答结构: 1. 解释问题:用户在使用adb shell am start命令时遇到"Permission Denial: not exported"错误。 2. 分析原因:这是因为目标Activity没有导出(exported属性为false),因此不能被ADB启动。 3. 解决方案: - 修改AndroidManifest.xml,将目标Activity的android:exported属性设置为true。 - 或者,添加一个intent-filter,例如包含<action android:name="android.intent.action.MAIN" />,这样Activity可以被隐式启动。 - 确保在命令中正确指定Intent。如果使用action,确保只有一个Activity处理该action,或使用显式Intent。 4. 示例命令:提供正确命令格式。 5. 生成相关问题。 引用:在回答中自然地添加引用。例如,提到"如引用[1]所述"。 生成相关问题:基于主题,如ADB命令、Android权限、Activity导出等。 最终回答: - 开头:直接回应用户问题。 - 主体:逐步解释。 - 结尾:相关问题。</think>### ADB启动Activity遇到"Permission Denial: not exported"错误的解决方案 您的问题是关于使用`adb shell am start`命令启动Activity时,遇到`Permission Denial: not exported`错误。这通常发生在尝试启动一个未导出(exported属性为false)的Activity时。下面我将逐步解释原因并提供解决方案,确保回答真实可靠,基于Android开发最佳实践和相关引用。 #### 问题原因 - **核心问题**:Android系统禁止外部应用(包括ADB)启动未导出的Activity。在AndroidManifest.xml文件中,如果目标Activity的`android:exported`属性设为`false`(默认值),则该Activity只能被同一应用内的组件启动。ADB作为外部工具,尝试启动时会触发权限拒绝错误[^1][^2]。 - **您的命令分析**:您使用的命令`adb shell am start android.intent.action.MAIN`指定了Intent action(`android.intent.action.MAIN`),但未指定包名或完整组件路径。系统会尝试查找处理该action的Activity。如果目标Activity未导出或未正确配置intent-filter,就会报错`Permission Denial: not exported`[^2][^3]。 - **常见场景**:此错误在性能测试(如测量启动时间)或调试时常见,因为开发者常使用ADB命令模拟启动过程,但忽略了Activity的导出设置[^1]。 #### 解决方案 以下是针对此问题的完整解决步骤,分为修改AndroidManifest.xml和调整ADB命令两部分: 1. **修改AndroidManifest.xml(推荐永久修复)** 在您的Android项目中,打开`AndroidManifest.xml`文件,找到目标Activity的声明,并确保它可被外部启动: - **方案A:设置`android:exported="true"`** 直接将Activity的`exported`属性设为`true`。这允许ADB或其他应用启动该Activity。 示例代码: ```xml <activity android:name=".YourActivity" android:exported="true" /> <!-- 添加此行 --> ``` 注意:如果业务逻辑要求该Activity不被其他应用调用,测试后请恢复为`false`以避免安全风险[^1]。 - **方案B:添加intent-filter(适用于隐式启动)** 如果Activity需要处理特定action(如`android.intent.action.MAIN`),添加一个intent-filter。系统会自动将`exported`设为`true`(当intent-filter存在时)。 示例代码: ```xml <activity android:name=".YourActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <!-- 指定action --> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> ``` 此方法更安全,因为它限制了只有匹配该intent的应用才能启动Activity[^3]。 2. **调整ADB命令(临时或测试用)** 修改命令以确保正确指定目标组件: - **使用显式Intent(推荐)**: 通过`-n`参数直接指定包名和Activity类名,避免依赖action。 命令格式: ``` adb shell am start -n <包名>/<完整Activity类路径> ``` 示例(假设包名为`com.example.app`,Activity类为`MainActivity`): ``` adb shell am start -n com.example.app/com.example.app.MainActivity ``` 如果Activity已导出,此命令可成功启动。 - **使用隐式Intent(需intent-filter支持)**: 如果Activity添加了intent-filter(如方案B),可以使用action启动,但需确保action唯一。 命令格式: ``` adb shell am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n <包名>/<Activity类路径> ``` 示例: ``` adb shell am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n com.example.app/com.example.app.MainActivity ``` 3. **验证和注意事项** - **重新安装应用**:修改Manifest后,重新构建并安装APK(使用`adb install -r app.apk`)。 - **权限检查**:如果Activity涉及敏感操作,确保未设置额外权限(如`android:permission`),否则ADB可能仍需授权。 - **安全提示**:在发布版本中,应将非公开Activity的`exported`设为`false`,防止恶意调用[^1][^2]。 #### 错误处理示例 如果您在尝试测量启动时间(如`adb shell am start -W ...`)时遇到此错误,先确保Activity导出,再运行命令。例如: ``` # 错误示例(Activity未导出) adb shell am start -W com.example.app/.MainActivity # 输出:java.lang.SecurityException: Permission Denial: not exported... # 修复后(导出Activity) adb shell am start -W -n com.example.app/com.example.app.MainActivity # 输出:Starting: Intent { cmp=com.example.app/.MainActivity } # Status: ok # ThisTime: 500 # 启动时间(毫秒) ``` 此过程参考了类似问题的解决经验[^1][^2][^3]。 ### 相关问题 1. **如何安全地导出Activity以避免安全漏洞?** 2. **除了ADB,还有哪些工具可以测量Android应用的启动时间?** 3. **Android中exported属性与intent-filter的关系是什么?** [^1]: adb命令计算启动时间时报"java.lang.SecurityException:Permisssion Denial:starting Intent...not exported。在对app中优化时,发现某个界面加载很慢;在使用adb shell am start -W 包名/类的相对路径计算启动时间时报错。查了下清单文件发现要计算启动时间的activity的exported属性为false(业务没有要求支持其它应用调用当前组件,所以一直为false),这里计算改为true即可。 [^2]: adb shell am start 报SecurityException Permission Denial。使用 am start -n example.com.aidl/example.com.aidl.ItemDetailActivity命令启动activity时,偶尔(某些activity)会碰到报此错误:java.lang.SecurityException: Permission Denial: starting Intent...not exported from uid... [^3]: 打开activity,报错java.lang.SecurityException: Permission Denial: starting Intent { act=android....。此activity加入action属性:<intent-filter><action android:name="android.intent.action.MAIN" /></intent-filter>。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值