Android アプリ開発「MATRIX」

Androidアプリの開発に役立つサンプル集

GPSの使用権限「パーミッション」を取得する方法(Android 6.0~)

GPSの使用権限「パーミッション」を取得する方法

今回は、GPS(位置情報)の使用権限「パーミッション」を取得する方法の説明です。 

以前は「インストール時」に使用権限を取得していましたが、Android 6.0(APIレベル23)からは「アプリを実行してから」必要な使用権限を取得することになっています。

① サンプルコード(MainActivity.java

このサンプルでは、まず、アプリの起動時にGPSパーミッションをチェックして使用権限の有り無しを表示しています。

その後、「GPS情報を取得する」ボタンを押した時に、GPS情報の取得権限が無い場合は取得権限の許可を求めるダイアログが表示され、既にGPS情報の取得権限が有る場合は取得権限の許可を求めるダイアログが表示されることなくGPS情報の取得が開始される仕組みになっています。 

public class MainActivity extends AppCompatActivity implements View.OnClickListener, LocationListener {

private static LocationManager mLocationManager; //ロケーションマネージャー
private static Criteria mCriteria; //精度
private static String mProvider; //プロバイダー文字列
private static Button mButton; //ボタン
private static TextView mTextView; //テキスト表示

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//レイアウトファイルをセットする
setContentView(R.layout.activity_main);

//TextView取得
mTextView = (TextView)findViewById(R.id.textView);

//ボタン生成
mButton = (Button)findViewById(R.id.button);
//ボタンにクリックイベントを設定
mButton.setOnClickListener(this);

//GPSの精度を設定
mCriteria = new Criteria();
mCriteria.setAccuracy(Criteria.ACCURACY_FINE);
mCriteria.setPowerRequirement(Criteria.POWER_HIGH);

//ロケーションマネージャー取得
mLocationManager = (LocationManager)getSystemService(LOCATION_SERVICE);

p_check();
}

@Override
public void onClick(View v) {

switch (v.getId()) {

case R.id.button:
//ボタンが押されたら緯度経度の取得処理へ
gps_get();
break;
}
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);

switch (requestCode) {
case 1:

if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

//パーミッションチェック
p_check();
}

break;
}
}

//GPSパーミッションをチェックする
public void p_check() {

//GPSの使用が許可されているかをチェック
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

//テキスト表示変更
mTextView.setText("GPSの使用は許可されていません…");

} else {

mTextView.setText("GPSの使用は許可されています");
}
}

//GPSをゲットする
public void gps_get() {

//GPSの使用が許可されているかをチェック
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

//GPSの仕様が許可されていなければパーミッションを要求
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);

return;

} else {

mTextView.setText("GPS取得中・・・");
}

//プロバイダー生成
mProvider = mLocationManager.getBestProvider(mCriteria, true);
//GPS取得開始
mLocationManager.requestLocationUpdates(mProvider, 0, 0, this);
}

@Override
public void onLocationChanged(Location location) {
//位置情報が取得されると呼び出される(必要に応じて記述)
mTextView.setText("GSPを取得しました");
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
//必要に応じて記述
}

@Override
public void onProviderEnabled(String provider) {
//必要に応じて記述
}

@Override
public void onProviderDisabled(String provider) {
//必要に応じて記述
}
}

② サンプルコード(AndroidManifest.xml

GPS情報を取得するためにはマニフェストファイルに以下の記述が必要です。

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

③ サンプルコード(activity_main.xml

テキストビューとボタンだけの構成です。特筆すべきところはありません。

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="パーミッション情報"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:text="GPS情報を取得する"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />

④ 結果

インストール直後はGPSの使用権限がありませんので、「GPSの使用は許可されていません…」と表示されます。

f:id:vw-dsg:20180915230537j:plain

そのまま「GPS情報を取得する」ボタンを押して位置情報を取得しようとすると、確認ダイアログが表示され「アプリに位置情報へのアクセスを許可しますか?」と聞かれます。

f:id:vw-dsg:20180915230751j:plain

確認ダイアログの「ALLOW(許可)」を選択すると、アプリに位置情報へのアクセスが許可され中央のメッセージが「GPSの使用は許可されています」に変わり、この時点で位置情報へのアクセスが可能になります。

f:id:vw-dsg:20180915231031j:plain

再度「GPS情報を取得する」ボタンを押すと、ダイアログが表示されることなく位置情報へのアクセスが開始され情報が取得されます。

f:id:vw-dsg:20180915231327j:plain

※今回のサンプルでは具体的な位置情報(緯度経度など)は取得していません。

⑤ 備考・その他

Android 6.0 からは使用権限(パーミッション)を機能ごとに許可できるようになったので、「カメラとマイクは許可するけど、位置情報は許可しない・・・」というような柔軟なアプリの使い方が可能になりますね。

END