Android 6.0 "gps" 位置提供者需要 ACCESS_FINE_LOCATION 许可
Android 6.0 "gps" location provider requires ACCESS_FINE_LOCATION permission
我的清单中定义了所有使用 gps 的权限。喜欢
"uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
"uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
每次我尝试在 Android 6.0 上打开此 activity 时,它都会以 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.access00(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.access00(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)
这是我的 Konkurranse/Competition activity。我删除了不相关的代码,如菜单和操作栏。
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);
}
};
}
有关新权限策略以及如何在运行时请求权限,请参阅 https://developer.android.com/training/permissions/requesting.html。
Serg 的回答是正确的。随着 Marshmallow(Android 6.0,API 级别 23)权限系统发生了变化,现在您需要通过在运行时请求权限来照顾 Marshmallow 设备。有一些库可以使这个过程更容易。
Easy Permissions就是其中之一。
我的清单中定义了所有使用 gps 的权限。喜欢
"uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
"uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
每次我尝试在 Android 6.0 上打开此 activity 时,它都会以 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.access00(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.access00(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)
这是我的 Konkurranse/Competition activity。我删除了不相关的代码,如菜单和操作栏。
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);
}
};
}
有关新权限策略以及如何在运行时请求权限,请参阅 https://developer.android.com/training/permissions/requesting.html。
Serg 的回答是正确的。随着 Marshmallow(Android 6.0,API 级别 23)权限系统发生了变化,现在您需要通过在运行时请求权限来照顾 Marshmallow 设备。有一些库可以使这个过程更容易。
Easy Permissions就是其中之一。