标签: mediastore

Android:如何通过MTP连接时检测MediaStore中的更改

我对MediaStore有很大的问题.当MediaStore通过MTP进行更改时,我需要处理事件.我已经有一个接收器用于android.intent.action.MEDIA_SCANNER_FINISHED操作,但它仅对通用大容量存储(UMS)有用.扫描程序不通过MTP启动,因为MTP直接更改了MediaStore数据库.

请你如此善良,帮助我如何发现这一事件.非常感谢您的帮助!

events android action mediastore mtp

5
推荐指数
2
解决办法
8013
查看次数

从contentResolver删除文件仅从数据库中删除条目(不是文件)

我尝试使用contentResolver删除文件,但仅从数据库而不是实际文件中删除条目。因此,我尝试先删除条目,然后再删除文件:

int rows = context.getContentResolver().delete(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
MediaStore.Audio.Media._ID + "=" + idSong, null);

// Remove file from card
if (rows != 0) {
Uri uri = ContentUris.withAppendedId(
        MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, idSong);
File f = new File(uri.getPath());
if(!f.delete())
    Log.d("fail-2", "fail-2");  
}
else
Log.d("fail-1", "fail-1");
Run Code Online (Sandbox Code Playgroud)

...,输出为“ fail-2”。为什么?

为什么ContentResolver不删除真实文件?这正常吗?

android mediastore android-contentresolver

5
推荐指数
1
解决办法
2587
查看次数

删除照片后如何刷新Android的MediaStore

问题:如何让媒体商店刷新其DELETED文件的条目?

从外部存储中删除代码中的照片后,我仍然在库中看到已删除照片的插槽 - 空白照片.

看起来画廊反映了媒体商店,并且在电话重新启动之前,媒体商店中已找到已删除的照片 - 直到重新扫描媒体.

尝试扫描删除的文件并没有帮助扫描删除的文件(工作只是为新的或现有的文件): MediaScannerConnection.scanFile(Application.get(), new String[]{file.getPath()}, null, null)(我试过扫描父文件夹以及).

也试图ACTION_MEDIA_SCANNER_SCAN_FILE无济于事.例:Application.get().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)))

发送广播接收器以重新扫描整个外部存储(从而刷新媒体存储)就可以了: Application.get().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.fromFile(Environment.getExternalStorageDirectory())))

但是,从4.4开始,Android似乎在尝试手动发送ACTION_MEDIA_MOUNTED系统广播时抛出安全异常.请参阅@ CommonsWare的帖子:http://commonsware.com/blog/2013/11/06/android-4p4-permission-regressions.html

所以,我没有解决在文件(/ photo/video/etc.)删除时刷新媒体商店的问题.

android mediastore android-mediascanner

5
推荐指数
1
解决办法
6832
查看次数

某些设备不存在Uri content:// media / external / file

我的某些设备有问题。我无法在任何设备上复制它,但是有些用户报告了很多崩溃报告。

这是例外:

java.lang.IllegalArgumentException: Unknown URL content://media/external/file
    at android.content.ContentResolver.delete(ContentResolver.java:1024)
Run Code Online (Sandbox Code Playgroud)

我用这个:

context.getContentResolver()。delete(MediaStore.Files.getContentUri(“ external”),MediaStore.Files.FileColumns.DATA +“ =?”,新的String [] {path});

之后,我调用MediaScannerConnection.scanFile()文件的父目录,因为这是如何通知MediaScanner有关文件删除以及如何刷新MTP内容的最有效的方法。我尝试了在stackoverflow上找到的所有其他方式(例如,Android如何使用MediaScannerConnection scanFile),但没有任何一种方法能达到这个目的。

顺便说一句。我仅将其用于API 11及更高版本。肯定安装了外部存储。

我有以下问题:1.您知道发生此异常的任何原因吗?我不想只是忽略异常。而且,当大多数设备都能正常运行时,我也不想删除此代码。2.您知道一些新的可靠方法,如何在删除某些文件时通知MediaScanner,以及如何立即刷新MTP的内容吗?

file-io android mediastore android-mediascanner

5
推荐指数
1
解决办法
16万
查看次数

获取特定文件夹的MediaStore路径

我正在为我的应用程序创建一个更新,在其中我有一个包含已保存图像的文件夹,我想在GridView中显示.我已经在使用Ion库了.图书馆的创建者(Koush Dutta)已经有一个样本做我想做的事情,并在GridView中显示SD卡的所有图像..

我想要做的是只显示GridView中SD卡(称为漫画)上特定文件夹的图像.我直接使用上面示例中的代码,只修改了一些名称.

我的问题是我不能只将SD卡中的图像放入GridView,目前它从SD卡中获取所有图像.我只想从文件夹/ sdcard/Comics /

public class SavedComics extends Activity {
    private MyAdapter mAdapter;

    // Adapter to populate and imageview from an url contained in the array adapter
    private class MyAdapter extends ArrayAdapter<String> {
        public MyAdapter(Context context) {
            super(context, 0);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // see if we need to load more to get 40, otherwise populate the adapter
            if (position > …
Run Code Online (Sandbox Code Playgroud)

android gridview mediastore android-ion

5
推荐指数
1
解决办法
5782
查看次数

标题和显示名称之间有什么区别

我需要一个文件(MYFILE.TXT)的全名,并正在考虑标题和Diaplay名称MediaColumns.你能告诉我两者之间的区别以及何时使用哪个?

android mediastore

5
推荐指数
1
解决办法
758
查看次数

无法请求READ_EXTERNAL_STORAGE权限

我试图从存储中读取图像路径,我在这里继续获取SecurityException:

Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=31409, uid=10053 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
Run Code Online (Sandbox Code Playgroud)

我正在编译反对api 23并且在我的Manifest中明确说明了我的Manifest的直接子项.我也理解新的运行时权限声明,当您想要访问存储时,您必须在运行时请求权限.当我写这行开始检查权限时,我得到一个无法在IDE中解决的问题:

ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
Run Code Online (Sandbox Code Playgroud)

无法解析符号Manifest.permission.READ_EXTERNAL_STORAGE.我可以在我的代码中明确说明的唯一Manifest.permission是Manifest.permission.C2D_MESSAGE而没有得到无法解决的错误.还有其他我需要编译才能访问代码中的其他权限吗?

要清楚这是给我SecurityException的代码块:

public List<String> getCameraImagesFull(Context context) {
        Cursor cursor = null;
        String[] star = {"*"};
        ArrayList<String> result = new ArrayList<>();
        cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, star, null, null, MediaStore.MediaColumns.DATE_ADDED + " DESC");
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                do {
                    String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                    result.add(path);
                } while (cursor.moveToNext());
            }
            cursor.close();
        }
        return result;
    }
Run Code Online (Sandbox Code Playgroud)

这是抛出异常的行:

cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, star, …
Run Code Online (Sandbox Code Playgroud)

android mediastore android-permissions android-6.0-marshmallow

5
推荐指数
1
解决办法
4970
查看次数

MediaStore.Images.Media.insertImage - java.io.FileNotFoundException - Android

注意:类似的问题在下面的SO链接上被询问,但是所提出的解决方案都没有为我工作,因此开始这个线程.

  1. 尝试保存图像时,MediaStore.Images.Media.insertImage返回null
  2. 为什么Images.Media.insertImage返回null

问题陈述: 我正在从网址下载图像,然后尝试共享相同的图像.为了达到这个目的,我需要Uri,我通过在MediaStore.Images.Media中保存图像来获得它.

码:

A.从AsyncTask类中获取下载的图像

public void processDownloadedImage(Bitmap bitmap) {
        if (bitmap == null) {
            Toast.makeText(this,"Image could not be downloaded and shared!",Toast.LENGTH_LONG).show();
        }
        else {
            downloadedImage = bitmap;
            checkPermissionShowShareSheet();
        }
    }
Run Code Online (Sandbox Code Playgroud)

B.检查Marshmallow及更高级别的许可

public void checkPermissionShowShareSheet() {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (!Settings.System.canWrite(this)){
                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},2909);
            }
            else {


            updateImageUri(downloadedImage);
            showShareSheet(downloadedImageUri);
        }
    }
    else {
        updateImageUri(downloadedImage);
        showShareSheet(downloadedImageUri);
    }
}
Run Code Online (Sandbox Code Playgroud)

C.获取图像Uri

private void updateImageUri(Bitmap inImage){
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);

        fixMediaDir();
        String path = MediaStore.Images.Media.insertImage(this.getContentResolver(), inImage, …
Run Code Online (Sandbox Code Playgroud)

android uri image mediastore

5
推荐指数
1
解决办法
1993
查看次数

在RecyclerView中显示带有视频文件的文件夹

我在回收站视图中列出了所有媒体文件.假设媒体文件在文件夹中,那么我想在我的回收站视图中显示该文件夹.这是我列出媒体文件的代码

var projection = arrayOf(MediaStore.Video.Media.DISPLAY_NAME)
var cursor = CursorLoader(applicationContext, MediaStore.Video.Media.EXTERNAL_CONTENT_URI, 
    projection, null, null, null).loadInBackground()

if (cursor != null) {
    while (cursor.moveToNext()) {
        val name = cursor.getString(cursor.getColumnIndex(MediaStore.Video.VideoColumns.DISPLAY_NAME))
        Log.i("Main", name)
    }
    cursor.close()
}
Run Code Online (Sandbox Code Playgroud)

如果文件夹中存在特定媒体文件,我还如何显示该文件夹.任何帮助将不胜感激.

android mediastore kotlin android-recyclerview

5
推荐指数
1
解决办法
800
查看次数

如何仅使用其内容Uri强制对文件进行MediaStore更新

Android Q中不建议使用MediaStore.Files.FileColumns.DATA 字段,该字段可以为Null或应用程序在以此类OS版本为目标时无权读取它,因此最好仅使用文件内容Uri进行工作。

由于MediaScannerConnection仅接受文件路径,因此我发现对于Android Q,这不再是一个选择。

在不知道其真实路径且仅使用其Uri的情况下,如何强制MediaStore 自动更新/重新扫描单个文件的方法是什么?这样做的目的不是什至试图找到真正的道路,而只能依靠乌里。

考虑强制更新的Uri是媒体内容Uri (而不是SAF Uri)。
示例:content:// media / external / images / media / 123

解决方案一定不能是重新扫描整个存储或再次卸载/装入存储,因为这将在我们的工作流程中造成很高的性能损失,并将使其完全无法使用。

并且由于打算仅使用Uri,因此避免强行扫描文件的任何特定目录,如果其中包含大量文件,这也会产生影响,并暗示必须从Uri解析真实目录路径,这不是一个选择。

更新:

我们尝试 Android O中引入的ContentResolver.refresh方法,但结果没有成功,但是当涉及诸如以下内容的媒体内容Uri时,此方法根本不做任何刷新:content:// media / external / images / media / 123

final ContentResolver resolver = context.getContentResolver();
resolver.refresh(uri, null, null);
Run Code Online (Sandbox Code Playgroud)

android uri mediastore android-mediascanner

5
推荐指数
1
解决办法
629
查看次数