当前位置: 首页 > 知识库问答 >
问题:

Android 6.0“gps”位置提供商需要访问\u精细\u位置权限

傅峻
2023-03-14

我已经在我的清单中定义了使用gps的所有前置任务。喜欢

“使用权限android:name=“android。准许进入“精细位置”/

"使用权限android: name="android.permission.ACCESS_COARSE_LOCATION"/

每次我尝试在Android 6.0上打开此活动时,它都会以此logcat消息停止。但在一些手机上也能用。有人能帮我弄清楚,并提供解决方案吗。我花了好几天的时间试图弄明白这一点,以及如何解决它。

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{org.data.smurf/org.data.smurf.Konkurranse}: java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission.
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
   at android.app.ActivityThread.access$1100(ActivityThread.java:221)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:158)
   at android.app.ActivityThread.main(ActivityThread.java:7224)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission.
   at android.os.Parcel.readException(Parcel.java:1620)
   at android.os.Parcel.readException(Parcel.java:1573)
   at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:688)
   at android.location.LocationManager.requestLocationUpdates(LocationManager.java:908)
   at android.location.LocationManager.requestLocationUpdates(LocationManager.java:469)
   at org.data.smurf.Konkurranse.onCreate(Konkurranse.java:197)
   at android.app.Activity.performCreate(Activity.java:6876)
   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
   at android.app.ActivityThread.access$1100(ActivityThread.java:221)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:158)
   at android.app.ActivityThread.main(ActivityThread.java:7224)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

这是我的Konkuranse/竞赛活动。我已经删除了与菜单和actionbar无关的代码。

Public class Konkurranse Extends Activity {

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        Fresco.initialize(getApplicationContext());
        setContentView(R.layout.activity_konkurranse);
        LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);



        final com.facebook.Profile profile = com.facebook.Profile.getCurrentProfile();
        final ProfilePictureView profilePictureView = (ProfilePictureView) findViewById(R.id.profilepic);
        final TextView name = (TextView) findViewById(R.id.name);
        simpleDraweeView = (SimpleDraweeView) findViewById(R.id.profilePicture);
        RoundingParams roundingParams = RoundingParams.fromCornersRadius(50f);
        roundingParams.setRoundAsCircle(true);
        simpleDraweeView.getHierarchy().setRoundingParams(roundingParams);


        /// Logged IN \\\
        if (profile != null) {
            profilePictureView.getProfileId();
            profilePictureView.setProfileId(profile.getId());
            name.setText(profile.getName());
            simpleDraweeView.setImageURI(profile.getProfilePictureUri(100, 100));
        }


        final SharedPreferences sharedPrefs = getSharedPreferences("details", MODE_PRIVATE);
        //After referencing your Views, add this.
        final String nameStr = sharedPrefs.getString("name", null);
        final String idStr = sharedPrefs.getString("id", null);
        AccessToken token = AccessToken.getCurrentAccessToken();
        if (token != null) {
            if (nameStr != null) name.setText(nameStr);
            if (idStr != null) profilePictureView.setProfileId(idStr);
            simpleDraweeView.setImageURI(profile.getProfilePictureUri(100, 100));
        }

        //.. Do the same for other profile data


        mobilnummer = (EditText) findViewById(R.id.mobilnummer);

        buttongps = (Button) findViewById(R.id.gps);
        buttongps.setOnClickListener(onButtongpsClick);

        buttonblue = (Button) findViewById(R.id.bluetooth);
        buttonblue.setOnClickListener(onButtonblueClick);


        final LocationManager manager;
        manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        final ImageView gpsImg = (ImageView) findViewById(R.id.gpsstatus);
        if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            gpsImg.setImageResource(R.drawable.ok);
        } else {
            gpsImg.setImageResource(R.drawable.notok);  //not ok
        }

        // Register bluettoth listener
        bluetoothListener = new BluetoothListener() {
            @Override
            public void onBluetoothOff() {
                btImg.setImageResource(R.drawable.notok);  //not ok
            }

            @Override
            public void onBluetoothOn() {
                btImg.setImageResource(R.drawable.ok);
            }
        };
        IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
        registerReceiver(bluetoothListener, filter);

        gpsListener = new GPSListener(this) {
            @Override
            public void onGPSOff() {
                gpsImg.setImageResource(R.drawable.notok);  //not ok

            }

            @Override
            public void onGPSOn() {
                gpsImg.setImageResource(R.drawable.ok);
            }
        };

        // Henter fra SharedPrefs
        SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
        String savedMobileNumber = prefs.getString("mobilnummer", "");
        mobilnummer.setText(savedMobileNumber);


        final ImageView tlfstatus = (ImageView) findViewById(R.id.tlfstatus);
        if (mobilnummer.getText().toString().length() >= 8) {
            tlfstatus.setImageResource(R.drawable.ok);
        } else {
            tlfstatus.setImageResource(R.drawable.notok); //not ok
        }





        // OnCreate ends here.
    }



    public View.OnClickListener onButtongpsClick = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent gpsOptionsIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(gpsOptionsIntent);
        }
    };


    public View.OnClickListener onButtonblueClick = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            BluetoothAdapter mBluetoothAdapter;
            mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
            if (!mBluetoothAdapter.isEnabled()) mBluetoothAdapter.enable();
            ImageView img = (ImageView) findViewById(R.id.bluestatus);
            img.setImageResource(R.drawable.ok);
        }
    };
}

共有2个答案

鲁单弓
2023-03-14

看见https://developer.android.com/training/permissions/requesting.html了解新的权限策略以及如何在运行时请求权限。

姚星宇
2023-03-14

塞格的回答是正确的。随着Marshmallow(Android 6.0,API级别23)许可系统的改变,现在您需要通过在运行时请求权限来管理Marshmallow设备。有一些库可以简化此过程。

轻松权限就是其中之一。

 类似资料:
  • 我正在尝试从最好的提供商那里获取位置。我启用了GPS。此外,当我打印纬度和经度时,我从网络提供商那里获取它。 我的问题是: 如果启用了GPS,那么我想通过GPS搜索30秒的位置。在那之后,如果我的精度低于200米,那么我就使用它。如果精度超过200米,我会再次搜索,然后从网络提供商那里开始。 之后,我比较两者的准确性,并获取更准确的提供商的数据。 这是我的代码: LocationUtil。JAVA

  • 我正在检查移动设备上是否启用了位置服务,如果是,请监听构建GoogleAppClient并监听位置更改。我面临的问题是,一旦在mobile中打开位置并重新启用,我就无法获得位置(纬度/长)。位置始终为空。 isLocationEnabled检查位置是否已打开

  • 问题内容: 我正在开发一个可获取用户指定的纬度,经度和海拔高度的APP,然后在手机上伪造该GPS位置,并在Google地图中显示我位于该位置。我对清单文件具有必需的权限,并且在开发人员设置中启用了模拟位置。 但是看起来我的GPS位置在Google地图上根本没有改变,这是什么问题? 更新:我刚刚在手机上安装了一个名为“ fake GPS location”的应用程序,该应用程序可以正常运行,但是我仍

  • 精灵位置 现在你知道了怎么创建和显示一个精灵,让我们学习如何定位他们的位置和改变他们的大小 在最早的示例里那个猫的精灵被放在了舞台的左上角。它的x和y坐标都是0。你可以通过改变它的x和y坐标的值来改变他们的位置。下面的例子就是你通过设置x和y为96坐标让它在舞台上居中。 cat.x = 96; cat.y = 96; 在你创建这个精灵之后,把这两行代码放进setup方法。 function set

  • 我目前正在尝试获取用户当前位置的经纬度。我已在清单中启用以下权限。TargetSDK和min sdk是23 为了做到这一点,我知道我需要对权限执行运行时检查。然而,当我执行以下操作时,我总是得到-1作为回报。(权限被拒绝) 尝试访问当前位置时是否缺少步骤? 完整代码如下:

  • 其次,检查GPS是否启用,以及GPS提供商是否工作正常,我可以从GPS提供商那里获取纬度和经度。 第三,如果GPS关闭,我试图从网络提供商那里获得位置。但是,在这种情况下有时我不能成功地获取位置。 所以,我必须让用户打开GPS,并且在打开GPS后必须得到位置。