Demo: Request READ_MEDIA_VIDEO on API 33+

More info in: https://developer.android.com/about/versions/13/behavior-changes-13#granular-media-permissions

PiperOrigin-RevId: 506908079
This commit is contained in:
huangdarwin 2023-02-03 16:21:11 +00:00 committed by microkatz
parent 9cb2b6e196
commit c4faae6b03
4 changed files with 19 additions and 17 deletions

View File

@ -22,6 +22,7 @@
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
<application <application
android:allowBackup="false" android:allowBackup="false"

View File

@ -15,10 +15,12 @@
*/ */
package androidx.media3.demo.transformer; package androidx.media3.demo.transformer;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.READ_MEDIA_VIDEO;
import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Assertions.checkState;
import static androidx.media3.common.util.Util.SDK_INT;
import android.Manifest;
import android.app.Activity; import android.app.Activity;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
@ -43,7 +45,6 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityCompat;
import androidx.media3.common.C; import androidx.media3.common.C;
import androidx.media3.common.MimeTypes; import androidx.media3.common.MimeTypes;
import androidx.media3.common.util.Util;
import androidx.media3.transformer.TransformationRequest; import androidx.media3.transformer.TransformationRequest;
import com.google.android.material.slider.RangeSlider; import com.google.android.material.slider.RangeSlider;
import com.google.android.material.slider.Slider; import com.google.android.material.slider.Slider;
@ -288,7 +289,7 @@ public final class ConfigurationActivity extends AppCompatActivity {
videoMimeSpinner.setAdapter(videoMimeAdapter); videoMimeSpinner.setAdapter(videoMimeAdapter);
videoMimeAdapter.addAll( videoMimeAdapter.addAll(
SAME_AS_INPUT_OPTION, MimeTypes.VIDEO_H263, MimeTypes.VIDEO_H264, MimeTypes.VIDEO_MP4V); SAME_AS_INPUT_OPTION, MimeTypes.VIDEO_H263, MimeTypes.VIDEO_H264, MimeTypes.VIDEO_MP4V);
if (Util.SDK_INT >= 24) { if (SDK_INT >= 24) {
videoMimeAdapter.add(MimeTypes.VIDEO_H265); videoMimeAdapter.add(MimeTypes.VIDEO_H265);
} }
@ -487,13 +488,11 @@ public final class ConfigurationActivity extends AppCompatActivity {
} }
private void selectLocalFile(View view) { private void selectLocalFile(View view) {
int permissionStatus = String permission = SDK_INT >= 33 ? READ_MEDIA_VIDEO : READ_EXTERNAL_STORAGE;
ActivityCompat.checkSelfPermission( if (ActivityCompat.checkSelfPermission(/* context= */ this, permission)
ConfigurationActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE); != PackageManager.PERMISSION_GRANTED) {
if (permissionStatus != PackageManager.PERMISSION_GRANTED) {
String[] neededPermissions = {Manifest.permission.READ_EXTERNAL_STORAGE};
ActivityCompat.requestPermissions( ActivityCompat.requestPermissions(
ConfigurationActivity.this, neededPermissions, FILE_PERMISSION_REQUEST_CODE); /* activity= */ this, new String[] {permission}, FILE_PERMISSION_REQUEST_CODE);
} else { } else {
launchLocalFilePicker(); launchLocalFilePicker();
} }

View File

@ -16,9 +16,11 @@
package androidx.media3.demo.transformer; package androidx.media3.demo.transformer;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.READ_MEDIA_VIDEO;
import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Assertions.checkState;
import static androidx.media3.common.util.Assertions.checkStateNotNull; import static androidx.media3.common.util.Assertions.checkStateNotNull;
import static androidx.media3.common.util.Util.SDK_INT;
import static androidx.media3.transformer.Transformer.PROGRESS_STATE_NOT_STARTED; import static androidx.media3.transformer.Transformer.PROGRESS_STATE_NOT_STARTED;
import android.app.Activity; import android.app.Activity;
@ -44,6 +46,7 @@ import android.widget.Toast;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.media3.common.C; import androidx.media3.common.C;
import androidx.media3.common.DebugViewProvider; import androidx.media3.common.DebugViewProvider;
import androidx.media3.common.Effect; import androidx.media3.common.Effect;
@ -52,7 +55,6 @@ import androidx.media3.common.audio.AudioProcessor;
import androidx.media3.common.audio.SonicAudioProcessor; import androidx.media3.common.audio.SonicAudioProcessor;
import androidx.media3.common.util.GlUtil; import androidx.media3.common.util.GlUtil;
import androidx.media3.common.util.Log; import androidx.media3.common.util.Log;
import androidx.media3.common.util.Util;
import androidx.media3.effect.BitmapOverlay; import androidx.media3.effect.BitmapOverlay;
import androidx.media3.effect.Contrast; import androidx.media3.effect.Contrast;
import androidx.media3.effect.DrawableOverlay; import androidx.media3.effect.DrawableOverlay;
@ -195,7 +197,7 @@ public final class TransformerActivity extends AppCompatActivity {
"debugFrame", "debugFrame",
}) })
private void startTransformation() { private void startTransformation() {
requestTransformerPermission(); requestReadVideoPermission(/* activity= */ this);
Intent intent = getIntent(); Intent intent = getIntent();
Uri uri = checkNotNull(intent.getData()); Uri uri = checkNotNull(intent.getData());
@ -683,12 +685,11 @@ public final class TransformerActivity extends AppCompatActivity {
} }
} }
private void requestTransformerPermission() { private static void requestReadVideoPermission(AppCompatActivity activity) {
if (Util.SDK_INT < 23) { String permission = SDK_INT >= 33 ? READ_MEDIA_VIDEO : READ_EXTERNAL_STORAGE;
return; if (ActivityCompat.checkSelfPermission(activity, permission)
} != PackageManager.PERMISSION_GRANTED) {
if (checkSelfPermission(READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(activity, new String[] {permission}, /* requestCode= */ 0);
requestPermissions(new String[] {READ_EXTERNAL_STORAGE}, /* requestCode= */ 0);
} }
} }

View File

@ -21,6 +21,7 @@
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_MEDIA"/>
<uses-sdk/> <uses-sdk/>
<application <application