とあるアプリが、きっかけで、ようやく permission コードを実装する機会を得ました。
参考にしたのは、実行時のパーミッション リクエスト(Runtime Permission) 色々まとめ
たくさん権限が必要な場合、煩わしいので、こんなコードにしました。
import android.Manifest;
import android.content.pm.PackageManager;
// 古い場合
//import android.support.v4.app.ActivityCompat;
//import android.support.v4.content.ContextCompat;
//import android.support.v7.app.AppCompatActivity;
// 新しい場合
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.appcompat.app.AppCompatActivity;
//
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
public class FooActivity extends AppCompatActivity {
public static final int REQUEST_CODE = 1001;
private static final String [] needPermissions = new String[] {
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.CAMERA,
Manifest.permission.INTERNET
};
/*!
@brief 許可の得られていない権限を取得する
*/
ArrayList getNeededPermissions() {
ArrayList<String> result = new ArrayList<String>();
for( String s: needPermissions ) {
if (ContextCompat.checkSelfPermission(this, s) != PackageManager.PERMISSION_GRANTED) {
result.add(s);
}
}
return result;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_foo);
ArrayList<String> permissions = getNeededPermissions();
if( permissions.size() > 0) {
// パーミッションの許可をリクエスト
ActivityCompat.requestPermissions(this, permissions.toArray(new String[permissions.size()]), REQUEST_CODE);
} else {
// 許可が必要なコード
processAny();
}
}
// requestPermissionsのコールバック
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE:
ArrayList<String> needed = getNeededPermissions();
if( needed.size() > 0 ) {
// 必要な権限の許可が足りない
Toast.makeText(this, "本アプリを実行するための権限の許可が取れませんでした", Toast.LENGTH_LONG).show();
finish();
} else {
// 必要な権限の許可がされた
processAny();
}
break;
default:
break;
}
}
private void processAny() {
// ...
}
// ...
}



