网站恶意镜像 301,wordpress 新浪图床,购物网站补货提醒软件怎么做,seo刷词背景与问题描述
在Android设备上进行文件管理时#xff0c;开发者或测试人员经常需要将图片、视频等媒体文件推送到设备#xff0c;并希望这些文件能立即在系统媒体库#xff08;如Gallery应用#xff09;中显示。然而#xff0c;随着Android版本的迭代#xff0c;特别是…背景与问题描述在Android设备上进行文件管理时开发者或测试人员经常需要将图片、视频等媒体文件推送到设备并希望这些文件能立即在系统媒体库如Gallery应用中显示。然而随着Android版本的迭代特别是Android 11API Level 29的发布原有的实现方式发生了变化导致一些传统方法不再适用。本文将详细探讨在不同Android版本中如何实现文件推送后自动刷新媒体库的功能。Android 11以下版本的实现方法传统广播方式在Android 11以下版本中系统提供了android.intent.action.MEDIA_SCANNER_SCAN_FILE广播用于通知媒体扫描器扫描指定目录下的新文件。具体实现步骤如下使用ADB命令推送文件首先通过ADB将文件从本地计算机推送到Android设备的指定目录。例如推送一张图片到设备的Pictures目录adb push /path/to/local/image.jpg /mnt/sdcard/Pictures/发送广播触发扫描推送文件后发送广播以触发媒体扫描器adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///mnt/sdcard/Pictures/此命令会通知媒体扫描器扫描/mnt/sdcard/Pictures/目录并更新媒体库。Android 11及以上版本的挑战与解决方案广播废弃与新要求从Android 11开始android.intent.action.MEDIA_SCANNER_SCAN_FILE广播被标记为废弃。官方文档指出调用者应当直接在MediaStore中插入条目系统检测到变动时会自动进行扫描。然而这一变化对于需要通过ADB命令实现自动刷新的场景带来了挑战。自定义广播接收器的实现为了在Android 11及以上版本中实现类似功能我们可以自定义一个广播接收器来处理媒体扫描请求。以下是一个在Appium项目中实现的示例广播接收器代码/* Copyright 2012-present Appium Committers Licensed under the Apache License, Version 2.0 (the License); you may not use this file except in compliance with the License. http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */packageio.appium.settings.receivers;importandroid.app.Activity;importandroid.content.BroadcastReceiver;importandroid.content.Context;importandroid.content.Intent;importandroid.media.MediaScannerConnection;importandroid.util.Log;importjava.io.File;importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;publicclassMediaScannerReceiverextendsBroadcastReceiverimplementsHasAction{privatestaticfinalStringTAGMediaScannerReceiver.class.getSimpleName();privatestaticfinalStringACTIONio.appium.settings.scan_media;privatestaticfinalStringPATHpath;// 递归获取目录下的所有文件privateListStringfetchFiles(Fileroot){if(root.isFile()){returnroot.canRead()?Collections.singletonList(root.toString()):Collections.emptyList();}File[]itemsroot.listFiles();if(itemsnull){returnCollections.emptyList();}ListStringfilePathsnewArrayList();for(Fileitem:items){filePaths.addAll(fetchFiles(item));}returnfilePaths;}/** * 处理广播请求扫描指定路径下的文件 * 示例命令am broadcast -a io.appium.settings.scan_media -e path /sdcard/yolo */OverridepublicvoidonReceive(Contextcontext,Intentintent){Log.d(TAG,Scanning the requested media);if(!intent.hasExtra(PATH)){Log.e(TAG,No path has been provided);setResultCode(Activity.RESULT_CANCELED);setResultData();return;}FileitemnewFile(intent.getStringExtra(PATH));if(!item.exists()){Log.e(TAG,String.format(The item at %s does not exist,item.toString()));setResultCode(Activity.RESULT_CANCELED);setResultData();return;}ListStringfilePathsfetchFiles(item);if(filePaths.isEmpty()){Log.i(TAG,String.format(Found no files to scan at %s,item.toString()));}else{// 使用MediaScannerConnection的scanFile方法进行文件扫描MediaScannerConnection.scanFile(context,filePaths.toArray(newString[0]),null,null);Log.i(TAG,String.format(Successfully scanned %s file(s) at %s,filePaths.size(),item.toString()));}setResultCode(Activity.RESULT_OK);setResultData();}OverridepublicStringgetAction(){returnACTION;}}广播接收器的注册与使用注册广播接收器在Android应用的AndroidManifest.xml文件中注册自定义的广播接收器并指定其接收的action为io.appium.settings.scan_media。发送自定义广播使用ADB命令发送自定义广播以触发媒体扫描adb shell am broadcast -a io.appium.settings.scan_media -e path /sdcard/Pictures/这条命令会通知自定义的广播接收器扫描/sdcard/Pictures/目录下的所有文件并更新媒体库。总结与展望随着Android版本的更新实现文件推送后自动刷新媒体库的方法也在不断演进。在Android 11以下版本中传统广播方式仍然有效而在Android 11及以上版本中则需要通过自定义广播接收器或直接在MediaStore中插入条目来实现。