Android - 如何修复权限异常

时间:2016-09-07 11:04:22

标签: android permissions

我试图使用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天,但我没有合适的答案。

请帮帮我。

3 个答案:

答案 0 :(得分:2)

根据READ_PHONE_STATE,您错过了<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 权限。

将以下行添加到您的Manifest:

protectionLevel

由于此权限的dangerousvar totally = eval(arr.join('+')) ,因此在API级别23+上,您可能需要在运行时请求此权限。

检查this link运行时权限。

答案 1 :(得分:1)

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

<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"/>

答案 2 :(得分:1)

我认为你是在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