安全例外:权限' android.permission.LOCATION_HARDWARE'未授予

时间:2018-04-09 11:24:30

标签: java android location securityexception

我正在开发一个应用程序,我使用塔位置跟踪位置。 所以我使用geo location api来跟踪位置并访问手机状态以获取网络详细信息。

这很好用,突然它开始为LOCATION_HARDWARE权限提供安全例外。

我还尝试在manifest中提供权限以及请求权限运行时。但是在运行时,它仅询问位置和电话状态权限,而不是location_hardware权限。然后它崩溃了安全例外。

我没有得到它要求location_hardware权限的目的。

我被困在这里。

    public class MainActivity extends AppCompatActivity {

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

        setUpUI();
 public void setUpUI()
    {
     TrackingJob.schedulePeriodic(); // crashing here
    }
    }
    }
}

跟踪工作:

    public class TrackingJob extends Job {

    static final String TAG = "tracking";

    @NonNull
    @Override
    protected Result onRunJob(Params params) {

        Intent pi = new Intent(getContext(), GetLocationService.class);

        getContext().startService(pi);

        return Result.SUCCESS;
    }

    public static void schedulePeriodic() {
        new JobRequest.Builder(TrackingJob.TAG)
                .setPeriodic(TimeUnit.MINUTES.toMillis(15), TimeUnit.MINUTES.toMillis(15))
                .setUpdateCurrent(true)
                .setPersisted(true)
                .build()
                .schedule();

    }
}

GetLocationServer:

public class GetLocationService extends IntentService {
    String networkSubType = "";
    SessionData mSessionData;
    private SharedPreferences preferences;

    public GetLocationService() {
        super("GetLocationService");
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        if (ContextCompat.checkSelfPermission(GetLocationService.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(GetLocationService.this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {


            mSessionData = new SessionData(GetLocationService.this);

            Calendar calendarSet = Calendar.getInstance();
            Calendar calendarNow = Calendar.getInstance();

            calendarSet.set(Calendar.HOUR_OF_DAY, 7); // hour
            calendarSet.set(Calendar.MINUTE, 00); // minute
            calendarSet.set(Calendar.SECOND, 0); // second

            Calendar calendarEnd = Calendar.getInstance();

            calendarEnd.set(Calendar.HOUR_OF_DAY, 20); // hour
            calendarEnd.set(Calendar.MINUTE, 00); // minute
            calendarEnd.set(Calendar.SECOND, 0); // second


            SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.out.println(calendarNow.getTime());
// Output "Wed Sep 26 14:23:28 EST 2012"

            String currentTime = format1.format(calendarNow.getTime());
            System.out.println(currentTime);

            if (calendarNow.compareTo(calendarSet) >= 0 && calendarNow.compareTo(calendarEnd) <= 0) {

                TelephonyManager telephonyManager = (TelephonyManager) GetLocationService.this.getSystemService(Context.TELEPHONY_SERVICE);
                GsmCellLocation cellLocation = (GsmCellLocation) telephonyManager.getCellLocation();

                ConnectivityManager connectivityManager = (ConnectivityManager) GetLocationService.this.getSystemService(Context.CONNECTIVITY_SERVICE);//?????????
                NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();

                if (cellLocation != null) {

                    int cellid = cellLocation.getCid();
                    int celllac = cellLocation.getLac();

                    if (activeNetInfo != null) {
                        networkSubType = activeNetInfo.getSubtypeName();
                    }

                    String networkOperator = telephonyManager.getNetworkOperator();

                    int mcc = Integer.parseInt(networkOperator.substring(0, 3));
                    int mnc = Integer.parseInt(networkOperator.substring(3));

                    String networkOperatorName = telephonyManager.getNetworkOperatorName();
                    int type = telephonyManager.getNetworkType();


                    Log.d("CellLocation", cellLocation.toString());
                    Log.d("GSM CELL ID", String.valueOf(cellid));
                    Log.d("GSM Location Code", String.valueOf(celllac));


                    Log.d("MCC", String.valueOf(mcc));
                    Log.d("MNC", String.valueOf(mnc));
                    Log.d("NetworkOperatorName", networkOperatorName);
                    Log.d("radioType", String.valueOf(type));
                    Log.d("Network subtype name", networkSubType);


                    AddLocationAsyncTask addLocationAsyncTask = new AddLocationAsyncTask(GetLocationService.this);
                    addLocationAsyncTask.execute(mSessionData.getString("user_id", ""), String.valueOf(cellid), String.valueOf(celllac), String.valueOf(mcc), String.valueOf(mnc),
                            networkOperatorName, networkSubType, currentTime);

                //    LocationUtility.scheduleJob(getApplicationContext());

                }
            }
        }
    }
}

我该如何解决这个问题?请帮忙。

谢谢..

编辑:运行时权限:

public class StartUpActivity extends AppCompatActivity {

    RelativeLayout relativeLayout;
    public int mShortAnimationDuration = 5000;
    private Button btnRegister,btnLogin;
    private final static int MY_PERMISSIONS_REQUEST_ACCESS_LOCATION = 10;
    private SessionData mSessionData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start_up);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        mSessionData = new SessionData(StartUpActivity.this);


        if (ContextCompat.checkSelfPermission(StartUpActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(StartUpActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(StartUpActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(StartUpActivity.this, Manifest.permission.LOCATION_HARDWARE) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(StartUpActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE,Manifest.permission.LOCATION_HARDWARE},
                    MY_PERMISSIONS_REQUEST_ACCESS_LOCATION);

        }
        else {

            if(!mSessionData.getString("user_id","").equals(""))
            {
                Intent i = (new Intent(StartUpActivity.this, MainActivity.class));
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);
                finish();
            }
            else {

                setUpUI();
                listeners();
            }
        }
    }

    public void setUpUI()
    {

        relativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout);
        btnLogin = (Button) findViewById(R.id.button_login);
        btnRegister = (Button) findViewById(R.id.button_register);
    }

    public void listeners()
    {

        btnRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent i = (new Intent(StartUpActivity.this, SignUpActivity.class));
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);
                finish();

            }
        });

        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent i = (new Intent(StartUpActivity.this, LoginActivity.class));
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);
                finish();
            }
        });
    }
    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {

            case MY_PERMISSIONS_REQUEST_ACCESS_LOCATION: {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    setUpUI();
                    listeners();

                } else {

                    CommonUtils.showAlert(StartUpActivity.this,"Please accept the permissions to proceed.",getString(R.string.app_name));
                    ActivityCompat.requestPermissions(StartUpActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE,Manifest.permission.LOCATION_HARDWARE},
                            MY_PERMISSIONS_REQUEST_ACCESS_LOCATION);
                }
                return;
            }     
        }
    }
}

清单权限:

   <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-feature android:name="android.hardware.location.network"/>

2 个答案:

答案 0 :(得分:1)

引自此处: https://developer.android.com/guide/topics/manifest/uses-feature-element.html#permissions

  

如果您的应用针对Android 5.0(API级别21)或更高版本并使用   ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION权限以便   您可以分别从网络或GPS接收位置更新   还必须明确声明您的应用使用了   android.hardware.location.network或android.hardware.location.gps   硬件功能。

将此类似内容添加到AndroidManifest.xml标记之外的<application/>文件中:

<uses-feature android:name="android.hardware.location.network"/>

<application>
  ...
</application>

如果位置功能不是您应用中的“必备”功能,以便应用正常运行,请将其添加到uses-feature代码 - android:required="false"

您仍需要在运行时询问位置权限

答案 1 :(得分:0)

使用目标API 20及以下

添加ACCESS_FINE_LOCATION