【问题标题】:Android - How to fix permission Exception [duplicate]Android - 如何修复权限异常[重复]
【发布时间】:2017-01-15 01:02:36
【问题描述】:

我正在尝试使用 Skyhook 获取我的位置(经度和纬度)。 我构建成功了。

import android.app.IntentService;
import android.content.Intent;
import android.location.Address;
import android.location.Geocoder;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

import com.reader.ebook.commomUtill.CommonUtill;
import com.reader.ebook.wxpos.IntergratedLocationManager;
import com.reader.ebook.wxpos.LocationObj;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import java.util.Locale;

public class LocationService extends IntentService {

    String TAG = "Location_tag";

    public LocationService() {
        super(LocationService.class.getSimpleName());
    }

    public IntergratedLocationManager er;

    public Handler _handlerForStartSearch =  new Handler(){
        @Override
        public void handleMessage(final Message msg){
            switch(msg.what){
                case 0:
                    er.getPos();
                    _handlerForStartSearch.sendEmptyMessageDelayed(0, CommonUtill.updateRate);
                    break;
                case IntergratedLocationManager.ILM_LOCATION_MESSAGE:
                    final LocationObj loc = (LocationObj) msg.obj;

                    try{
                        float current_latitude = loc._latitude;
                        float current_longitude = loc._longitude;
                        CommonUtill.setCoordination(current_latitude, current_longitude);

                    }catch (Exception e){
                        e.printStackTrace();
                    }

                    break;
            }
        }
    };
...
}

但我不知道我的位置。 相反,我得到一个Exception

java.lang.SecurityException: caller does not have permission to access phone state

我尝试解决此问题 2 天,但我不适合回答。

请帮帮我。

【问题讨论】:

  • 你在哪个版本的android中测试这段代码?
  • @Prashant 低于 6,因为在 6 中你会得到更具体的异常

标签: android permissions


【解决方案1】:

根据Exception,您缺少READ_PHONE_STATE 权限。

将以下行添加到您的清单中:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

由于此权限的protectionLeveldangerous,因此在 API 级别 23+ 上,您可能需要在运行时请求此权限。

检查this link 的运行时权限。

【讨论】:

  • 感谢您的帮助。
【解决方案2】:

我认为您是在 Marshmallow 设备上测试它,如果是这样,那么您可能需要在活动开始时或按下某些特定按钮时请求许可。

首先确保您在清单中添加了此权限

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

对于 Marshmallow 及以上版本,使用一些有用的库可以更轻松地集成运行时权限,我最喜欢的是 PermissionUtils

你需要做的就是在应用级别编译依赖build.gradle

dependencies {
    compile 'rebus:permission-utils:1.0.3'
}

然后在onCreate你的活动中

PermissionManager.with(YourActivity.this)
    .permission(PermissionEnum.READ_PHONE_STATE)
    .askagain(true)
    .ask();

就是这样。您可以找到更多信息here

【讨论】:

    【解决方案3】:

    要访问位置,您必须在清单中添加以下权限:

    <uses-permission-sdk-23 android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 2016-11-12
      • 2013-11-06
      相关资源
      最近更新 更多