请求位置时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
相关产品推荐
相关产品推荐

