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

Android权限请求异常:仅触发存储权限请求,如何依次获取VIBRATE、EXTERNAL_STORAGE、INTERNET权限

解决Android权限请求中VIBRATE和INTERNET未被请求的问题

嗨,我来帮你理清这个权限问题的根源和解决办法~

为什么VIBRATE和INTERNET权限没弹出请求弹窗?

这俩权限属于Android的正常权限(Normal Permissions),这类权限的特点是:

  • 不会涉及用户隐私或敏感操作,系统会在应用安装时自动授予,完全不需要在运行时弹出请求对话框。
  • 只有危险权限(Dangerous Permissions)(比如存储、位置、相机这类直接接触用户隐私或设备敏感功能的)才需要动态请求。

你把这两个正常权限放进了运行时请求的数组里,但系统会直接忽略它们的请求,所以你看不到授权弹窗,但只要你在清单文件里声明了,它们其实已经被授予了。


正确的处理步骤

1. 先在AndroidManifest.xml里声明所有权限

这一步是基础,哪怕是正常权限也必须在清单里声明,否则系统不会授予:

<!-- 声明INTERNET权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 声明VIBRATE权限 -->
<uses-permission android:name="android.permission.VIBRATE" />
<!-- 存储权限属于危险权限,需要运行时请求 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. 精简运行时权限请求的代码

把不需要动态请求的正常权限从请求数组里删掉,只保留危险权限(也就是存储权限),这样代码更规范:

public class MainActivity extends AppCompatActivity {
    // 给请求码起个更清晰的名字
    private static final int STORAGE_PERMISSIONS_REQUEST_CODE = 101;
    // 只保留需要运行时请求的危险权限
    private final String[] dangerousPermissions = new String[]{
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        if (!hasPermissions(this, dangerousPermissions)) {
            ActivityCompat.requestPermissions(this, dangerousPermissions, STORAGE_PERMISSIONS_REQUEST_CODE);
        }
        // 其他无关代码
    }

    public static boolean hasPermissions(Context context, String... permissions) {
        if (context == null || permissions == null) {
            return false;
        }
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }
}

3. 验证权限是否生效

你可以通过实际操作来确认:

  • 调用振动功能:比如写一行代码((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(500);,如果手机能振动,说明VIBRATE权限已经生效。
  • 发起网络请求:比如访问一个API或网页,如果能正常获取数据,说明INTERNET权限没问题。

至于你提到的"未被授权的证明",其实是因为正常权限不会显示在应用权限设置的"可切换"列表里,但系统确实已经默认授予了它们,不用担心。


内容的提问来源于stack exchange,提问作者Ken Adams

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 14:22:26