Android(2.2および2.3)でGPSを利用しようとしていますが、LocationManagerオブジェクトを使用しようとすると次のエラーが表示されます。
WARN/System.err(522): Java.lang.SecurityException: Provider network requires ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION permission
私は他の投稿でこの問題を調査しましたが、通常はAndroidManifest.xmlの問題が原因です。しかし、私のものは問題ないようです:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.thedigitalsean.examples"
Android:versionCode="1"
Android:versionName="1.0">
<application Android:icon="@drawable/icon" Android:label="@string/app_name">
<activity Android:name=".GetLocation"
Android:label="@string/app_name">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission Android:name="Android.permisssion.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission Android:name="Android.permisssion.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission Android:name="Android.permisssion.INTERNET"></uses-permission>
</manifest>
以下は、try/catchブロックに入れられたGetLocationアクティビティのonCreateメソッドの問題のあるコード行です。
LocationManager locManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
final LocationListener locListener = new MyLocListener();
try{
locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locListener);
}
catch (SecurityException se){
((TextView)findViewById(R.id.infobox)).setText(se.toString());
se.printStackTrace();
}
これは、Android許可を要求する必要がある場合に書いた最初のアプリであり、これまでに許可を許可することに成功していません。マニフェストまたはおそらくEclipseの構成?
スペルが間違っています
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
私は同じ問題を抱えていて、自分が何を間違えていたのか理解できませんでした。 Android Studioはテキストをすべて大文字またはすべて小文字に変更していました(オートコンプリートの前に大文字または小文字を入力したかどうかによります)この問題が原因でOSが名前を登録していなかったため、権限がないことに関するエラーが表示されます。
正しい:
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
不正解:
<uses-permission Android:name="Android.PERMISSION.ACCESS_FINE_LOCATION" />
不正解:
<uses-permission Android:name="Android.permission.access_fine_location" />
これは些細なことのように思えるかもしれませんが、見落としがちです。
アクセス許可で大文字と小文字を区別しないようにする設定がある場合は、説明とともにコメントを追加してください。ありがとうございました!
すべてのSDKバージョンと互換性があります(Android.permission.ACCESS_FINE_LOCATION
はAndroid Mでdangerous
許可になり、ユーザーが手動で許可する必要があります)。
In Android以下のバージョンAndroid M ContextCompat.checkSelfPermission(...)
は、AndroidManifest.xml
でこれらの許可を追加すると、常にtrue
を返します)
public void onSomeButtonClick() {
...
if (!permissionsGranted()) {
ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 123);
} else doLocationAccessRelatedJob();
...
}
private Boolean permissionsGranted() {
return ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED);
}
@Override
public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 123) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission granted.
doLocationAccessRelatedJob();
} else {
// User refused to grant permission. You can add AlertDialog here
Toast.makeText(this, "You didn't give permission to access device location", Toast.LENGTH_LONG).show();
startInstalledAppDetailsActivity();
}
}
}
private void startInstalledAppDetailsActivity() {
Intent i = new Intent();
i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.setData(Uri.parse("package:" + getPackageName()));
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
androidManifest.xmlで:
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />