首先视频要求预置在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界面进行授权,如果找到更合适的修改方法,会更新。