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

请求位置时Android应用持续崩溃,Android Studio新手求助

嘿,作为Android Studio新手真的不用不好意思——咱们都是从摸不着头脑的阶段过来的!既然你已经在Manifest里声明了位置和网络权限,接下来有个关键细节得注意:ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION属于Android的「危险权限」,光在Manifest里写声明是不够的,必须在App运行时让用户手动授权才行。我给你整理了完整的实现步骤,你可以直接参考:

1. 先检查权限是否已经授权

在你的Activity类里,先写一个方法来判断用户有没有给过位置权限:

private boolean hasLocationPermissions() {
    int fineLocationPerm = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
    int coarseLocationPerm = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION);
    // 两个位置权限都授权了才返回true
    return fineLocationPerm == PackageManager.PERMISSION_GRANTED && coarseLocationPerm == PackageManager.PERMISSION_GRANTED;
}
2. 如果没授权,发起权限申请

当检测到权限未授权时,调用这个方法向用户申请权限:

private void requestLocationPermissions() {
    // 第二个参数是要申请的权限数组,第三个是自定义的请求码(只要唯一就行)
    ActivityCompat.requestPermissions(
        this,
        new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
        1001
    );
}
3. 处理用户的授权结果

重写Activity的onRequestPermissionsResult方法,来获取用户是同意还是拒绝了权限:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    // 匹配我们之前设置的请求码
    if (requestCode == 1001) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 权限授权成功!这里可以开始执行你的位置相关逻辑了
            Toast.makeText(this, "位置权限已授权", Toast.LENGTH_SHORT).show();
        } else {
            // 用户拒绝了权限,你可以在这里给个提示,引导用户去系统设置里开启权限
            Toast.makeText(this, "需要位置权限才能使用相关功能哦", Toast.LENGTH_SHORT).show();
        }
    }
}
4. 在合适的时机调用这些方法

比如在Activity的onCreate方法里,或者用户触发某个需要位置的功能时:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 页面加载时先检查权限
    if (!hasLocationPermissions()) {
        requestLocationPermissions();
    } else {
        // 已经有权限了,直接执行你的业务逻辑
    }
}

另外补充一点:你声明的INTERNET权限是普通权限,不需要动态申请,只要在Manifest里写了就会自动生效,不用额外处理~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:22:36