我对MediaStore有很大的问题.当MediaStore通过MTP进行更改时,我需要处理事件.我已经有一个接收器用于android.intent.action.MEDIA_SCANNER_FINISHED操作,但它仅对通用大容量存储(UMS)有用.扫描程序不通过MTP启动,因为MTP直接更改了MediaStore数据库.
请你如此善良,帮助我如何发现这一事件.非常感谢您的帮助!
我尝试使用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不删除真实文件?这正常吗?
问题:如何让媒体商店刷新其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.)删除时刷新媒体商店的问题.
我的某些设备有问题。我无法在任何设备上复制它,但是有些用户报告了很多崩溃报告。
这是例外:
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的内容吗?
我正在为我的应用程序创建一个更新,在其中我有一个包含已保存图像的文件夹,我想在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) 我需要一个文件(MYFILE.TXT)的全名,并正在考虑标题和Diaplay名称MediaColumns.你能告诉我两者之间的区别以及何时使用哪个?
我试图从存储中读取图像路径,我在这里继续获取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
注意:类似的问题在下面的SO链接上被询问,但是所提出的解决方案都没有为我工作,因此开始这个线程.
问题陈述: 我正在从网址下载图像,然后尝试共享相同的图像.为了达到这个目的,我需要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) 我在回收站视图中列出了所有媒体文件.假设媒体文件在文件夹中,那么我想在我的回收站视图中显示该文件夹.这是我列出媒体文件的代码
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 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)