Java Android:位置服务权限

Java Android:位置服务权限,java,android,android-location,locationmanager,Java,Android,Android Location,Locationmanager,我从位置管理器访问位置时遇到问题 这就是错误所在 04-24 11:12:10.999 9378-9378/com.example.devandrin.myapplication D/HomeActivity: "network" location provider requires ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission. 位置函数的代码 LocationManager lm = (LocationManager)

我从位置管理器访问位置时遇到问题

这就是错误所在

04-24 11:12:10.999 9378-9378/com.example.devandrin.myapplication D/HomeActivity: "network" location provider requires ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission.
位置函数的代码

LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
    boolean GPS;
    try {
        GPS = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
    } catch (Exception e) {
        GPS = false;
    }
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = cm.getActiveNetworkInfo();
    boolean data = info != null;
    if (!data || !GPS) {
        Utilities.MakeSnack(findViewById(R.id.cLayout), "Unable to get location");
    } else {
        try {
            lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1200, 50, new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {

                }

                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {

                }

                @Override
                public void onProviderEnabled(String provider) {

                }

                @Override
                public void onProviderDisabled(String provider) {

                }
            });
            Location l = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
            String url = "/setuserlocation/" + sp.getString("userID", "") +
                    "/" + l.getLatitude() +
                    "/" + l.getLongitude();
            StringRequest sr = new StringRequest(StringRequest.Method.GET, url, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Utilities.MakeToast(getInstance(), "Location Updated");
                    GregorianCalendar gc = new GregorianCalendar();
                    Date date = gc.getTime();
                    SharedPreferences.Editor e = sp.edit();
                    e.putString("DatePosted", date.toString());
                    e.commit();
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Utilities.MakeToast(getInstance(), "Location Wasn't updated");
                }
            });
            RequestQueueSingleton.getInstance(this).getRequestQueue().add(sr);

        } catch (SecurityException e) {
            Log.d("HomeActivity", e.getMessage());
        }

    }
LocationManager lm=(LocationManager)getSystemService(LOCATION\u服务);
布尔型GPS;
试一试{
GPS=lm.isProviderEnabled(LocationManager.GPS\U提供程序);
}捕获(例外e){
GPS=假;
}
ConnectivityManager cm=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_服务);
NetworkInfo=cm.getActiveNetworkInfo();
布尔数据=信息!=无效的
如果(!数据| |!GPS){
实用程序.MakeSnack(findviewbyd(R.id.cLayout),“无法获取位置”);
}否则{
试一试{
lm.RequestLocationUpdate(LocationManager.NETWORK_提供程序,1200,50,新LocationListener(){
@凌驾
已更改位置上的公共无效(位置){
}
@凌驾
public void onStatusChanged(字符串提供程序、int状态、Bundle extra){
}
@凌驾
公共无效onProviderEnabled(字符串提供程序){
}
@凌驾
公共无效onProviderDisabled(字符串提供程序){
}
});
位置l=lm.getLastKnownLocation(LocationManager.NETWORK_提供程序);
String url=“/setuserlocation/”+sp.getString(“userID”,”)+
“/”+l.getLatitude()+
“/”+l.getLongitude();
StringRequest sr=new StringRequest(StringRequest.Method.GET,url,new Response.Listener()){
@凌驾
公共void onResponse(字符串响应){
MakeToos(getInstance(),“位置已更新”);
GregorianCalendar gc=新的GregorianCalendar();
Date-Date=gc.getTime();
SharedReferences.Editor e=sp.edit();
e、 putString(“DatePosted”,date.toString());
e、 提交();
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
MakeToos(getInstance(),“位置未更新”);
}
});
RequestQueueSingleton.getInstance(this).getRequestQueue().add(sr);
}捕获(安全异常e){
Log.d(“HomeActivity”,例如getMessage());
}
}
以及在清单中设置的权限

<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />


应用程序的api级别为16,因此我无法在运行时请求权限,而应用程序在安装时也不会请求权限,有人能帮我解决此问题吗……

像这样获取您的运行时权限

    if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) ==
                    PackageManager.PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) ==
                            PackageManager.PERMISSION_GRANTED) {
                    // Permission already Granted
                    //Do your work here
//Perform operations here only which requires permission
            } else {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
            }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            if (requestCode == 1) {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                            //Permission Granted
                            //Do your work here
//Perform operations here only which requires permission
                }
            }
        }
如果尚未授予权限,则覆盖onRequestPermission结果如下

    if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) ==
                    PackageManager.PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) ==
                            PackageManager.PERMISSION_GRANTED) {
                    // Permission already Granted
                    //Do your work here
//Perform operations here only which requires permission
            } else {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
            }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            if (requestCode == 1) {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                            //Permission Granted
                            //Do your work here
//Perform operations here only which requires permission
                }
            }
        }

请确保权限超出清单中的应用程序标记。如果可能,请粘贴整个清单。您的targetSdkVersion是什么?@adelTurk这是正确的,因为Internet权限正在工作,我有一个webview,我确信它不会在我允许权限时崩溃,但如果我重新打开,它只能在授予权限时执行操作。否则它将崩溃。请将代码放入此条件和requestPermissionResult中