android 警告:Exported activity does not require permission

本文介绍了在Android应用开发中如何正确配置Activity的权限,避免安全隐患。包括如何设置Activity为不对外暴露,以及如何允许外部调用特定Activity的方法。

1. 在一个应用程序中添加了多个antivity后,在manifest.xml文件中会除了主Activity外,其它的Activity属性中都会有个警告:
Exported activity does not require permission

这是因为在Activity中添加了intent-filter属性,这个属性的添加意味着该Activity已经暴露给了不同进程的应用,也就是说其它的应用程序不需要任何权限就可以自由的实例化该Activity。显然,如果不是有特殊需求,没人会希望自己写得应用程序会有这么个隐患。

解决方法:
在Activity中添加:

android:exported="false"。

还有一种解决方法是定义Activity的权限。

转自:http://blog.youkuaiyun.com/imyang2007/article/details/8511669

2. 如果不使用action启动的话,那么使用包名+activity全名的方式或activity全名,那么必须在你所要调用的其他activity的声明中加入android:exported="true",以使其可以被外部调用就可以直接用你描述的方法直接调用了。

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/Theme.AppCompat.Light" tools:targetApi="31"> <activity android:name=".MainActivity" android:exported="true" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".DeviceControlActivity" android:exported="false" android:screenOrientation="portrait" android:parentActivityName=".MainActivity" /> <activity android:name=".DataChartActivity" android:exported="false" android:screenOrientation="portrait" android:parentActivityName=".MainActivity" /> <service android:name=".service.ZigbeeService" android:enabled="true" android:exported="false" /> </application> </manifest>
09-08
你提供的 `AndroidManifest.xml` 文件整体结构是 **合法的**,但存在一个明显的 **重复声明权限的问题**。我们来逐项分析: --- ## ❌ 问题分析 ### 🔁 重复的权限声明(错误) ```xml <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> ``` - 上述权限声明 **重复了两次**,这是完全没有必要的; - Android 编译系统会自动去重,但为了代码整洁性和可维护性,**应删除重复项**。 --- ## ✅ 正确做法:保留一份权限声明 只需保留一份即可: ```xml <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> ``` --- ## ✅ 完整修正后的 `AndroidManifest.xml` ```xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.example.zigbeeapp"> <!-- 网络权限 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 蓝牙权限 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/Theme.AppCompat.Light" tools:targetApi="31"> <activity android:name=".MainActivity" android:exported="true" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".DeviceControlActivity" android:exported="false" android:screenOrientation="portrait" android:parentActivityName=".MainActivity" /> <activity android:name=".DataChartActivity" android:exported="false" android:screenOrientation="portrait" android:parentActivityName=".MainActivity" /> <service android:name=".service.ZigbeeService" android:enabled="true" android:exported="false" /> </application> </manifest> ``` --- ## ✅ 建议补充说明 | 建议 | 说明 | |------|------| | 添加 `package` 属性 | 显式声明包名(如 `package="com.example.zigbeeapp"`)有助于避免混淆 | | 使用 Android 12+ 的新蓝牙权限(可选) | 如果使用了蓝牙扫描或连接功能,建议添加:`BLUETOOTH_SCAN` 和 `BLUETOOTH_CONNECT` | | 删除未使用的 `dataExtractionRules` 和 `fullBackupContent` | 如果没有使用 Android 自动备份功能,可以移除这两个属性 | --- ## ✅ 总结 - 你的 `AndroidManifest.xml` 文件整体结构是 **合法且规范的**; - 唯一的问题是 **重复声明了权限**,应删除重复项; - 建议显式添加 `package` 属性; - 如果你使用的是 Android 12 及以上版本,考虑使用新的蓝牙权限并进行动态申请。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值