2019年9月25日水曜日

遅まきながら Android の permission コードの実装をした。

 レガシーシステムの保守もあるので、なかなかAndroidの新しいpermissionの方法に移行できないでいました。
とあるアプリが、きっかけで、ようやく 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() {
      // ...
    }
    
    // ...

}

0 件のコメント: