我已将app-private文件夹中的文件复制到Pictures
或DCIM
,我想在我的应用中打开图库窗口小部件并显示这些图像。
但是,我的gallery小部件使用MediaStore id创建了一个缩略图库,并且新添加的图像不会出现在那里。
我尝试了在stackoverflow上建议的所有三个解决方案,以刷新媒体存储并告诉android有关新文件的存在
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
- 在较新的API中被禁止2
MediaScannerConnection.scanFile(context,
new String[]{ pathToFile1, pathToFile2 },
null, // tried also with a String[] with the mimetype, no difference
new MediaScannerConnectionClient()
{
public void onMediaScannerConnected(){
}
public void onScanCompleted(String path, Uri uri){
// URI is null, and the gallery doesn't display the image
}
});
3
public static void scanFile(Context context, String path, String mimeType ) {
Client client = new Client(path, mimeType);
MediaScannerConnection connection =
new MediaScannerConnection(context, client);
client.connection = connection;
connection.connect();
}
private static final class Client implements MediaScannerConnectionClient {
private final String path;
private final String mimeType;
MediaScannerConnection connection;
public Client(String path, String mimeType) {
this.path = path;
this.mimeType = mimeType;
}
@Override
public void onMediaScannerConnected() {
connection.scanFile(path, mimeType);
}
@Override
public void onScanCompleted(String path, Uri uri) {
connection.disconnect();
}
}
再次,uri为空
为什么Android会如此难以执行这种正常的合法行为? 如何在牛轧糖中达到这种效果?
编辑:我也尝试发送ACTION_MEDIA_SCANNER_SCAN_FILE
我甚至考虑到了这一点: https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat/en
所以现在我发送content://
而不是file://
URI,但仍然没有!
EDIT2:
我试过这个
public static void scheduleJob(Context context) {
JobScheduler js =
(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo job = new JobInfo.Builder(
MY_BACKGROUND_JOB,
new ComponentName(context, MyJobService.class))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setRequiresCharging(true)
.build();
js.schedule(job);
}
如此处所述
https://developer.android.com/topic/performance/background-optimization.html
但是,当我打开我的画廊时,新图像不存在
答案 0 :(得分:3)
原来我试图扫描我复制到另一个地方然后删除的文件的路径,而不是新创建的文件的路径。
结合使用媒体扫描程序和ACTION_MEDIA_SCANNER_SCAN_FILE
并尝试扫描正确的文件,我能够刷新媒体商店。
答案 1 :(得分:3)
我正在做类似的事情,它也在 Nougat 中工作。每当我调用getFilePaths();
方法时,它会返回手机存储中存在的所有图像的新ArrayList
。 -
public ArrayList<String> getFilePaths()
{
Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = {MediaStore.Images.ImageColumns.DATA};
Cursor c = null;
SortedSet<String> dirList = new TreeSet<String>();
ArrayList<String> resultIAV = new ArrayList<String>();
String[] directories = null;
if (u != null)
{
c = getContentResolver().query(u, projection, null, null, null);
}
if ((c != null) && (c.moveToFirst()))
{
do
{
String tempDir = c.getString(0);
tempDir = tempDir.substring(0, tempDir.lastIndexOf("/"));
try{
dirList.add(tempDir);
}
catch(Exception e)
{
}
}
while (c.moveToNext());
directories = new String[dirList.size()];
dirList.toArray(directories);
}
for(int i=0;i<dirList.size();i++)
{
File imageDir = new File(directories[i]);
File[] imageList = imageDir.listFiles();
if(imageList == null)
continue;
for (File imagePath : imageList) {
try {
if(imagePath.isDirectory())
{
imageList = imagePath.listFiles();
}
if ( imagePath.getName().contains(".jpg")|| imagePath.getName().contains(".JPG")
|| imagePath.getName().contains(".jpeg")|| imagePath.getName().contains(".JPEG")
|| imagePath.getName().contains(".png") || imagePath.getName().contains(".PNG")
|| imagePath.getName().contains(".gif") || imagePath.getName().contains(".GIF")
|| imagePath.getName().contains(".bmp") || imagePath.getName().contains(".BMP")
)
{
String path= imagePath.getAbsolutePath();
resultIAV.add(path);
}
}
// }
catch (Exception e) {
e.printStackTrace();
}
}
}
return resultIAV;
}
现在您将获得所有图像的路径。您可以调用getFilePaths().size();
返回图像数量,然后将其与之前的值进行比较。