Android日常开发 -android12开机播放视频

首先视频要求预置在sdcard/Download 路径下。
1。在Launcher中新增开机广播监听,因为Launcher是系统应用,所以可以直接收到开机广播。三方应用在现在手机上很多是被限制了的,为了加快开机速度。

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

 <receiver android:name="MovingReceiver"
           android:exported="true"           android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

2。开机广播中通过url播放音乐资源。

public class MovingReceiver extends BroadcastReceiver {
    private static final String TAG = "MovingReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "MovingReceiver "+ intent.getAction());
        playViedio(context);
    }

    public void playViedio(Context context) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(), "liolo.mp4");
        //获取 FileProvider 的授权 URI
        Uri videoUri = FileProvider.getUriForFile(context, context.getPackageName() + ".overview.fileprovider", file);
        if (videoUri != null) {
          Log.i(TAG, videoUri.toString());
        intent.setDataAndType(videoUri, "video/mp4");
        int flags = Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK;
        intent.setFlags(flags);
        context.startActivity(intent);
        }
    }
}

在Launcher中有相关的xml,我们不需要新增,只需要把我们的路径新增进去。
Launcher根目录中路径中的quickstep/res/xml/overview_file_provider_paths.xml
中 是我新增。

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <cache-path name="shared_images" path="/" />
    <files-path name="log_files" path="/" />
    <root-path name="apps" path="/" />
    <external-path name="external_files" path="Download"/>
</paths>

它引用的地方在源码中位置为

 <!-- FileProvider used for sharing images. -->
         <provider android:name="androidx.core.content.FileProvider"
              android:authorities="${packageName}.overview.fileprovider"
              android:exported="false"
              android:grantUriPermissions="true">
             <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
                  android:resource="@xml/overview_file_provider_paths"/>
         </provider>

FileProvider.getUriForFile(context, context.getPackageName() + “.overview.fileprovider”, file);这句代码中的第二个参数要与xml配置中的android:authorities="${packageName}.overview.fileprovider"匹配。

3。需要权限申请

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

如果是动态权限申请,手动点了权限弹框,这样就可以播放视频,但是如果想要默认授予权限,按照网上的攻略,修改DefaultPermissionGrantPolicy.java类里面的

  private static final Set<String> LAUNCHER_STORAGE_PERMISSIONS = new ArraySet<>();
    static {
        LAUNCHER_STORAGE_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE);
        LAUNCHER_STORAGE_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
    }


 public void grantDefaultPermissions(int userId) {
        DelayingPackageManagerCache pm = new DelayingPackageManagerCache();

        grantPermissionsToSysComponentsAndPrivApps(pm, userId);
        grantDefaultSystemHandlerPermissions(pm, userId);
        grantDefaultPermissionExceptions(pm, userId);

        PackageInfo pkg = pm.getPackageInfo("包名");
        Log.i(TAG,"grantDefaultPermissions start");
        if(pkg!=null){
          grantRuntimePermissions(pm, pkg, LAUNCHER_STORAGE_PERMISSIONS, true /*systemFixed*/, userId);
        }
        Log.i(TAG,"grantDefaultPermissions end");
        // Apply delayed state
        pm.apply();
    }

会发现权限还是没有默认授予上。
后来直接暴力修改了frameworks/base/core/java/android/app/AppOpsManager.java代码中的`

/**
2585       * This specifies the default mode for each operation.
2586       */
2587      private static int[] sOpDefaultMode = new int[] {
2588              AppOpsManager.MODE_ALLOWED, // COARSE_LOCATION
2589              AppOpsManager.MODE_ALLOWED, // FINE_LOCATION
2590              AppOpsManager.MODE_ALLOWED, // GPS
2591              AppOpsManager.MODE_ALLOWED, // VIBRATE
2592              AppOpsManager.MODE_ALLOWED, // READ_CONTACTS
2593              AppOpsManager.MODE_ALLOWED, // WRITE_CONTACTS
2594              AppOpsManager.MODE_ALLOWED, // READ_CALL_LOG
2595              AppOpsManager.MODE_ALLOWED, // WRITE_CALL_LOG
2596              AppOpsManager.MODE_ALLOWED, // READ_CALENDAR
2597              AppOpsManager.MODE_ALLOWED, // WRITE_CALENDAR
2598              AppOpsManager.MODE_ALLOWED, // WIFI_SCAN
2599              AppOpsManager.MODE_ALLOWED, // POST_NOTIFICATION
2600              AppOpsManager.MODE_ALLOWED, // NEIGHBORING_CELLS
2601              AppOpsManager.MODE_ALLOWED, // CALL_PHONE
2602              AppOpsManager.MODE_ALLOWED, // READ_SMS
2603              AppOpsManager.MODE_IGNORED, // WRITE_SMS
2604              AppOpsManager.MODE_ALLOWED, // RECEIVE_SMS
2605              AppOpsManager.MODE_ALLOWED, // RECEIVE_EMERGENCY_BROADCAST
2606              AppOpsManager.MODE_ALLOWED, // RECEIVE_MMS
2607              AppOpsManager.MODE_ALLOWED, // RECEIVE_WAP_PUSH
2608              AppOpsManager.MODE_ALLOWED, // SEND_SMS
2609              AppOpsManager.MODE_ALLOWED, // READ_ICC_SMS
2610              AppOpsManager.MODE_ALLOWED, // WRITE_ICC_SMS
2611              AppOpsManager.MODE_DEFAULT, // WRITE_SETTINGS
2612              getSystemAlertWindowDefault(), // SYSTEM_ALERT_WINDOW
2613              AppOpsManager.MODE_ALLOWED, // ACCESS_NOTIFICATIONS
2614              AppOpsManager.MODE_ALLOWED, // CAMERA
2615              AppOpsManager.MODE_ALLOWED, // RECORD_AUDIO
2616              AppOpsManager.MODE_ALLOWED, // PLAY_AUDIO
2617              AppOpsManager.MODE_ALLOWED, // READ_CLIPBOARD
2618              AppOpsManager.MODE_ALLOWED, // WRITE_CLIPBOARD
2619              AppOpsManager.MODE_ALLOWED, // TAKE_MEDIA_BUTTONS
2620              AppOpsManager.MODE_ALLOWED, // TAKE_AUDIO_FOCUS
2621              AppOpsManager.MODE_ALLOWED, // AUDIO_MASTER_VOLUME
2622              AppOpsManager.MODE_ALLOWED, // AUDIO_VOICE_VOLUME
2623              AppOpsManager.MODE_ALLOWED, // AUDIO_RING_VOLUME
2624              AppOpsManager.MODE_ALLOWED, // AUDIO_MEDIA_VOLUME
2625              AppOpsManager.MODE_ALLOWED, // AUDIO_ALARM_VOLUME
2626              AppOpsManager.MODE_ALLOWED, // AUDIO_NOTIFICATION_VOLUME
2627              AppOpsManager.MODE_ALLOWED, // AUDIO_BLUETOOTH_VOLUME
2628              AppOpsManager.MODE_ALLOWED, // WAKE_LOCK
2629              AppOpsManager.MODE_ALLOWED, // MONITOR_LOCATION
2630              AppOpsManager.MODE_ALLOWED, // MONITOR_HIGH_POWER_LOCATION
2631              AppOpsManager.MODE_DEFAULT, // GET_USAGE_STATS
2632              AppOpsManager.MODE_ALLOWED, // MUTE_MICROPHONE
2633              AppOpsManager.MODE_ALLOWED, // TOAST_WINDOW
2634              AppOpsManager.MODE_IGNORED, // PROJECT_MEDIA
2635              AppOpsManager.MODE_IGNORED, // ACTIVATE_VPN
2636              AppOpsManager.MODE_ALLOWED, // WRITE_WALLPAPER
2637              AppOpsManager.MODE_ALLOWED, // ASSIST_STRUCTURE
2638              AppOpsManager.MODE_ALLOWED, // ASSIST_SCREENSHOT
2639              AppOpsManager.MODE_ALLOWED, // READ_PHONE_STATE
2640              AppOpsManager.MODE_ALLOWED, // ADD_VOICEMAIL
2641              AppOpsManager.MODE_ALLOWED, // USE_SIP
2642              AppOpsManager.MODE_ALLOWED, // PROCESS_OUTGOING_CALLS
2643              AppOpsManager.MODE_ALLOWED, // USE_FINGERPRINT
2644              AppOpsManager.MODE_ALLOWED, // BODY_SENSORS
2645              AppOpsManager.MODE_ALLOWED, // READ_CELL_BROADCASTS
2646              AppOpsManager.MODE_ERRORED, // MOCK_LOCATION
2647              AppOpsManager.MODE_ALLOWED, // READ_EXTERNAL_STORAGE
2648              AppOpsManager.MODE_ALLOWED, // WRITE_EXTERNAL_STORAGE
2649              AppOpsManager.MODE_ALLOWED, // TURN_SCREEN_ON
2650              AppOpsManager.MODE_ALLOWED, // GET_ACCOUNTS
2651              AppOpsManager.MODE_ALLOWED, // RUN_IN_BACKGROUND
2652              AppOpsManager.MODE_ALLOWED, // AUDIO_ACCESSIBILITY_VOLUME
2653              AppOpsManager.MODE_ALLOWED, // READ_PHONE_NUMBERS
2654              AppOpsManager.MODE_DEFAULT, // REQUEST_INSTALL_PACKAGES
2655              AppOpsManager.MODE_ALLOWED, // PICTURE_IN_PICTURE
2656              AppOpsManager.MODE_DEFAULT, // INSTANT_APP_START_FOREGROUND
2657              AppOpsManager.MODE_ALLOWED, // ANSWER_PHONE_CALLS
2658              AppOpsManager.MODE_ALLOWED, // RUN_ANY_IN_BACKGROUND
2659              AppOpsManager.MODE_ALLOWED, // CHANGE_WIFI_STATE
2660              AppOpsManager.MODE_ALLOWED, // REQUEST_DELETE_PACKAGES
2661              AppOpsManager.MODE_ALLOWED, // BIND_ACCESSIBILITY_SERVICE
2662              AppOpsManager.MODE_ALLOWED, // ACCEPT_HANDOVER
2663              AppOpsManager.MODE_ERRORED, // MANAGE_IPSEC_TUNNELS
2664              AppOpsManager.MODE_ALLOWED, // START_FOREGROUND
2665              AppOpsManager.MODE_ALLOWED, // BLUETOOTH_SCAN
2666              AppOpsManager.MODE_ALLOWED, // USE_BIOMETRIC
2667              AppOpsManager.MODE_ALLOWED, // ACTIVITY_RECOGNITION
2668              AppOpsManager.MODE_DEFAULT, // SMS_FINANCIAL_TRANSACTIONS
2669              AppOpsManager.MODE_ALLOWED, // READ_MEDIA_AUDIO
2670              AppOpsManager.MODE_ERRORED, // WRITE_MEDIA_AUDIO
2671              AppOpsManager.MODE_ALLOWED, // READ_MEDIA_VIDEO
2672              AppOpsManager.MODE_ERRORED, // WRITE_MEDIA_VIDEO
2673              AppOpsManager.MODE_ALLOWED, // READ_MEDIA_IMAGES
2674              AppOpsManager.MODE_ERRORED, // WRITE_MEDIA_IMAGES
2675              AppOpsManager.MODE_DEFAULT, // LEGACY_STORAGE
2676              AppOpsManager.MODE_ALLOWED, // ACCESS_ACCESSIBILITY
2677              AppOpsManager.MODE_ERRORED, // READ_DEVICE_IDENTIFIERS
2678              AppOpsManager.MODE_ALLOWED, // ALLOW_MEDIA_LOCATION
2679              AppOpsManager.MODE_DEFAULT, // QUERY_ALL_PACKAGES
2680              AppOpsManager.MODE_DEFAULT, // MANAGE_EXTERNAL_STORAGE
2681              AppOpsManager.MODE_DEFAULT, // INTERACT_ACROSS_PROFILES
2682              AppOpsManager.MODE_IGNORED, // ACTIVATE_PLATFORM_VPN
2683              AppOpsManager.MODE_DEFAULT, // LOADER_USAGE_STATS
2684              AppOpsManager.MODE_IGNORED, // deprecated operation
2685              AppOpsManager.MODE_DEFAULT, // OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED
2686              AppOpsManager.MODE_ALLOWED, // OP_AUTO_REVOKE_MANAGED_BY_INSTALLER
2687              AppOpsManager.MODE_ERRORED, // OP_NO_ISOLATED_STORAGE
2688              AppOpsManager.MODE_ALLOWED, // PHONE_CALL_MICROPHONE
2689              AppOpsManager.MODE_ALLOWED, // PHONE_CALL_CAMERA
2690              AppOpsManager.MODE_ALLOWED, // OP_RECORD_AUDIO_HOTWORD
2691              AppOpsManager.MODE_DEFAULT, // MANAGE_ONGOING_CALLS
2692              AppOpsManager.MODE_DEFAULT, // MANAGE_CREDENTIALS
2693              AppOpsManager.MODE_DEFAULT, // USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER
2694              AppOpsManager.MODE_ALLOWED, // RECORD_AUDIO_OUTPUT
2695              AppOpsManager.MODE_DEFAULT, // SCHEDULE_EXACT_ALARM
2696              AppOpsManager.MODE_ALLOWED, // ACCESS_FINE_LOCATION_SOURCE
2697              AppOpsManager.MODE_ALLOWED, // ACCESS_COARSE_LOCATION_SOURCE
2698              AppOpsManager.MODE_DEFAULT, // MANAGE_MEDIA
2699              AppOpsManager.MODE_ALLOWED, // BLUETOOTH_CONNECT
2700              AppOpsManager.MODE_ALLOWED, // UWB_RANGING
2701              AppOpsManager.MODE_ALLOWED, // ACTIVITY_RECOGNITION_SOURCE
2702              AppOpsManager.MODE_ALLOWED, // BLUETOOTH_ADVERTISE
2703              AppOpsManager.MODE_ALLOWED, // RECORD_INCOMING_PHONE_AUDIO
2704      };
2705  

将 AppOpsManager.MODE_DEFAULT, // MANAGE_EXTERNAL_STORAGE强制改为 AppOpsManager.MODE_ALLOWED,MANAGE_EXTERNAL_STORAGE。
就可以了,因为MANAGE_EXTERNAL_STORAGE权限不需要动态申请,但是需要跳转settings界面进行授权,如果找到更合适的修改方法,会更新。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值