Androidアプリ開発

Android13対応(ファイルのメディア権限)

この記事は約15分で読めます。
記事内に広告が含まれています。
スポンサーリンク

こんにちは、まっさん(@Tera_Msaki)です。

この記事は Androidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Java での開発経験、XML構文規則、Android のアプリ開発経験がある方を対象としています。
Android のアプリ開発でお役にたててれば、嬉しいです。
(これから Android のアプリ開発や Java での開発を始めたい方への案内は、
記事の最後で紹介します)

この記事のテーマ


Android13でアプリからメディアストアの画像・音声・動画ファイルにアクセスする

Android 12(API レベル 32)以前で開発したアプリは、SdkVersion を Android 13(API レベル 33)にするだけでは、メディアストアの画像・音声・動画ファイルにアクセスできません
その理由は、Android 13 から
きめ細かいメディア権限 が導入されているからです。

スマホ端末に保存された画像、ビデオ、オーディオファイルにアクセスする場合、
メディアストアを使用します。

Android 13 の機能と変更点はこちらです↓↓↓

Android 12 対応( Bluetooth権限 )はこちらです↓↓↓

画像/音声/動画ファイルにアクセスするアプリのAndroid13対応

◎ポイント
Android 12 以前は、マニフェストファイル( AndroidManifest.xml )に、外部ストレージのアクセス( READ_EXTERNAL_STORAGE )の権限を、指定するだけで、画像・音声・動画ファイルにアクセスできました。
Android 13 では、アプリがメディアを使用する場合、画像や写真(
READ_MEDIA_IMAGES )、動画( READ_MEDIA_VIDEO )、音声ファイル( READ_MEDIA_AUDIO )の権限指定と、ユーザー承認をリクエストする必要があります。

ジャケット画像がついた音楽ファイルをダウンロードするならココ↓↓↓

マニフェストファイルに権限を指定する

マニフェストファイル( AndroidManifest.xml )に権限を指定します。
必要に応じて、画像や写真ファイル、動画ファイル、音声ファイルにアクセスする権限(
uses-permission )を追加します。

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    :
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
    :

外部ストレージのアクセス( READ_EXTERNAL_STORAGE )は、maxSdkVersion 属性を指定して、Android 12(API レベル 32)以前の場合に指定するようにします。

権限チェックとユーザ承認リクエスト

Android 12 (API レベル 32)より新しいバージョンの場合、アクセスが必要なメディアの権限が許可( PERMISSION_GRANTED )でない場合に、ユーザー承認をリクエストします。

    private static final int REQUEST_MULTI_PERMISSIONS = 101;
    :
    private void checkPermissions() {
        ArrayList<String> requestPermissions = new ArrayList<>();
        :
        // MediaStore
        if (Build.VERSION.SDK_INT > 32) {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_IMAGES) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions.add(Manifest.permission.READ_MEDIA_IMAGES);
            }
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_AUDIO) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions.add(Manifest.permission.READ_MEDIA_AUDIO);
            }
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_VIDEO) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions.add(Manifest.permission.READ_MEDIA_VIDEO);
            }
        } else {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions.add(Manifest.permission.READ_EXTERNAL_STORAGE);
            }
        }
        if (!requestPermissions.isEmpty()) {
            ActivityCompat.requestPermissions(this, requestPermissions.toArray(new String[0]), REQUEST_MULTI_PERMISSIONS);
        }
        :
    }

◎ユーザ承認のリクエスト画面

READ_MEDIA_IMAGE 、READ_MEDIA_VIDEO の権限のユーザ承認リクエスト画面
READ_MEDIA_AUDIO の権限のユーザ承認リクエスト画面

ユーザー承認結果を確認する

ユーザー承認の結果を確認し、許可(PERMISSION_GRANTED)でない場合は、処理を継続できないよう制御します。

   private boolean start = true;
   :   
   @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_MULTI_PERMISSIONS) {
            if (grantResults.length > 0) {
                for (int i = 0; i < permissions.length; i++) {
                    switch (permissions[i]) {
                        case Manifest.permission.READ_EXTERNAL_STORAGE:
                        case Manifest.permission.READ_MEDIA_IMAGE:
                        case Manifest.permission.READ_MEDIA_AUDIO:
                        case Manifest.permission.READ_MEDIA_VIDEO:
                            if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                                start = false;
                                :
                            }
                            break;
                        :

                        default:
                    }
                }
            }
        }
        if (start) {
            :

        } else {
            button.setVisibility(View.VISIBLE);
        }
    }

ボタンを非表示にすることで、処理を継続できないようにしています。

データセーフティセクションの情報提供

アプリが使用するメディアの権限をマニフェストファイルに追加した場合、データセーフティセクションの情報提供が必要になります。
データ セーフティの登録をせずに、メディアの権限がついたマニフェストファイルを含むアプリをリリースすると、Google
社より、「ご対応のお願い: Google Play のポリシーをアプリが遵守していません」といったタイトルのメールが届き、リリースが否認されます。

“ すべてのデベロッパーは、
Google Play で公開するアプリでユーザーデータをどのように収集、処理するかを申告し、
そのデータを暗号化などのセキュリティ保護対策によってどのように保護するか、
詳細を示す必要があります ”

データセーフティセクションについては、こちらです↓↓↓

データセーフティセクションの登録は、Google PLAY Console で対象のアプリを選択、メニューの アプリのコンテンツ にあります。

データ セーフティの登録

① Google PLAY Consoleのアプリのコンテンツ 」を選択し、データセーフティ 」をクリックします。

②「 」をクリックします。

すべて、「 はい 」を選択します。

④ アプリで使用するメディアに応じて、写真と動画の「 写真 」、「動画 」、音声ファイルの音楽ファイル 」にチェックを入れます。

⑤ チェックを入れたメディアの「 編集をクリックします。

⑥「 共有 」と「 アプリの機能 」にチェックを入れます。

⑦「 保存 をクリックします。
 チェックを入れたすべてのメディアについて、⑤⑥⑦を実施します。

保存すれば、申告内容で審査されます。

今回は、ここまでです。

参考 : Android 13 の機能と変更点のリスト

Android 13 のきめ細かいメディア権限 に対応している Androidアプリです。

誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にある
コメントか、
こちら
から、お願いいたします♪

ポチッとして頂けると、
次のコンテンツを作成する励みになります♪

ブログランキング・にほんブログ村へ