我使用以下代码片段在MediaStore缓存中插入一个Image:
__CODE__
插入没问题,但它也在同一路径上创建了另一个图像缩略图.这在图库中不可见,但在使用文件浏览器浏览时,此图像缩略图可见.如何在此处停止创建此图像缩略图,以免混淆用户.
我想使用Android SDK进行托管,其中返回的结果按其各自的文件扩展名进行过滤(例如,不一定是名称).我做了很多研究,很累,希望社区可以帮助我..我肯定答案就在那里,但是,除了阅读SQL书或其他什么,我只是想做点什么这应该很简单,但找不到解决方案.
我想要做的事情基本上是这样的:
managedQuery(Audio.Media.EXTERNAL_CONTENT_URI, myProjection, Audio.Media.DATA + " like ? ", new String[] {"%mp3%"}, null );
Run Code Online (Sandbox Code Playgroud)
这工作除了,如果标题是"mymp3.wav",这个查询仍将返回它,因为'mp3'在名称中,但这不是我想要的 - >我希望它纯粹基于文件过滤扩展(或者,如果有办法,可以使用文件类型[例如,如果mp3的文件扩展名更改为.wav,即使文件的内容实际上是mp3,也可以用于我的目的]) .解决方案应指明一种过滤多种扩展/文件类型的方法(例如,如果我希望查询返回所有.mp3文件以及.wav文件,但不返回.amr文件).
此外,虽然我有你,但我想按字母顺序对结果进行排序.我尝试过类似的东西:
managedQuery(Audio.Media.EXTERNAL_CONTENT_URI, myProjection, null, null, MediaStore.Audio.Media.TITLE + " ASC" );
Run Code Online (Sandbox Code Playgroud)
但是,这不会过滤整个结果...也就是说,返回的列表按照mp3标题进行排序,然后,最后,它会向列表追加.wav文件也按字母顺序排序但我希望整个列表都是按字母顺序排列的,无论文件类型如何.
我知道有人在这里可以轻松回答这个问题 - >提前谢谢!!!
我正在查询MediaStore.Images.Media.EXTERNAL_CONTENT_URI,查询工作正常.我能够从每个具有常量的列中获取数据,例如:
currentImage.ImageUrl = imagecursor.getString(imagecursor.getColumnIndex(MediaStore.Images.Media.DATA));
currentImage.Lat = imagecursor.getString(imagecursor.getColumnIndex(MediaStore.Images.Media.LATITUDE));
currentImage.Long = imagecursor.getString(imagecursor.getColumnIndex(MediaStore.Images.Media.LONGITUDE));
Run Code Online (Sandbox Code Playgroud)
宽度/高度列没有常量(不MediaStore.Images.Media.WIDTH)所以我试图访问它们imagecursor.getLong(imagecursor.getColumnIndex("width"));.
试图使用getLong,getString,getInt ......没有 - 总是一样崩溃.
这是堆栈:
02-22 19:38:26.242: E/AndroidRuntime(1607): FATAL EXCEPTION: main
02-22 19:38:26.242: E/AndroidRuntime(1607): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.MEDIA_SCANNER_FINISHED dat=file:///mnt/sdcard flg=0x10 } in com.Activity.android.chat.service.ChatService$ChatServiceReceiver@415b26c0
02-22 19:38:26.242: E/AndroidRuntime(1607): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:737)
02-22 19:38:26.242: E/AndroidRuntime(1607): at android.os.Handler.handleCallback(Handler.java:605)
02-22 19:38:26.242: E/AndroidRuntime(1607): at android.os.Handler.dispatchMessage(Handler.java:92)
02-22 19:38:26.242: E/AndroidRuntime(1607): at android.os.Looper.loop(Looper.java:137)
02-22 19:38:26.242: E/AndroidRuntime(1607): at android.app.ActivityThread.main(ActivityThread.java:4424)
02-22 19:38:26.242: E/AndroidRuntime(1607): at java.lang.reflect.Method.invokeNative(Native Method)
02-22 19:38:26.242: E/AndroidRuntime(1607): at java.lang.reflect.Method.invoke(Method.java:511)
02-22 …Run Code Online (Sandbox Code Playgroud) 我正在制作一个应用程序,将设备上的所有歌曲列在屏幕上并点击它们打开一个共享意图,其中歌曲/音频文件可以通过各种设备通过蓝牙,WhatsApp等不同的方式共享.但我不能从mediastore获取音频文件的文件路径或位置.
这就是我收听歌曲的方式 -
public void getSongList() {
//retrieve song info
ContentResolver musicResolver = getActivity().getContentResolver();
Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
//iterate over results if valid
if(musicCursor!=null && musicCursor.moveToFirst()){
//get columns
int titleColumn = musicCursor.getColumnIndex
(android.provider.MediaStore.Audio.Media.TITLE);
int idColumn = musicCursor.getColumnIndex
(android.provider.MediaStore.Audio.Media._ID);
int artistColumn = musicCursor.getColumnIndex
(android.provider.MediaStore.Audio.Media.ARTIST);
int albumId = musicCursor.getColumnIndex
(MediaStore.Audio.Media.ALBUM_ID);
int data= musicCursor.getColumnIndex(MediaStore.Audio.Media.DATA);
int albumkey=musicCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_KEY);
//add songs to list
do {
long thisId = musicCursor.getLong(idColumn);
String thisTitle = musicCursor.getString(titleColumn);
String thisArtist = musicCursor.getString(artistColumn);
long …Run Code Online (Sandbox Code Playgroud) 我正在尝试将视频保存到图库,以下代码适用于除Android Q之外的所有 Android 版本:
private void getPath() {
String videoFileName = "video_" + System.currentTimeMillis() + ".mp4";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
ContentResolver resolver = getContentResolver();
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, videoFileName);
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4");
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "Movies/" + "Folder");
contentValues.put(MediaStore.Video.Media.IS_PENDING, 1);
Uri collection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
Uri videoUri = resolver.insert(collection, contentValues);
if (videoUri != null) {
try (ParcelFileDescriptor pfd = resolver.openFileDescriptor(videoUri, "w", null)) {
OutputStream outputStream = null;
if (pfd != null) {
outputStream = resolver.openOutputStream(videoUri);
outputStream.flush();
outputStream.close();
}
} …Run Code Online (Sandbox Code Playgroud) 我尝试获取所有图像。我使用这个代码:
val galleryImageUrls = mutableListOf<String>()
val columns = arrayOf(MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID)
val orderBy = MediaStore.Images.Media.DATE_TAKEN
appContext.contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns,
null, null, "$orderBy DESC"
)?.use { cursor ->
while (cursor.moveToNext()) {
galleryImageUrls.add(cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)))//get Image from column index
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用 compileSdkVersion 28,则此代码有效,但不适用于 compileSdkVersion 29。您知道如何修复它吗?还是应该使用存储访问框架?
我正在检索不同文件夹列表,其中包含每个文件夹中包含视频数量的视频文件,这在具有 Android P 及以下版本的设备上运行良好,但是当我在具有 Android Q 的设备上运行时,应用程序崩溃。如何使其适用于运行 Android Q 的设备
java.lang.IllegalArgumentException:无效的列 DISTINCT bucket_display_name
日志猫:
java.lang.IllegalArgumentException: Invalid column DISTINCT bucket_display_name
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:170)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:423)
at android.content.ContentResolver.query(ContentResolver.java:944)
at android.content.ContentResolver.query(ContentResolver.java:880)
at android.content.ContentResolver.query(ContentResolver.java:836)
at com.aisar.mediaplayer.fragments.VideoFolderFragment$MediaQuery.getAllVideo(VideoFolderFragment.java:364)
at com.aisar.mediaplayer.fragments.VideoFolderFragment$VideosLoader.loadVideos(VideoFolderFragment.java:434)
at com.aisar.mediaplayer.fragments.VideoFolderFragment$VideosLoader.access$1100(VideoFolderFragment.java:413)
at com.aisar.mediaplayer.fragments.VideoFolderFragment$5.run(VideoFolderFragment.java:189)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
Run Code Online (Sandbox Code Playgroud)
我的代码:
public class MediaQuery {
private Context context;
private int count = 0;
private Cursor cursor;
List<ModelVideoFolder> videoItems;
public MediaQuery(Context context) {
this.context = context;
}
public List<ModelVideoFolder> getAllVideo(String query) {
String selection …Run Code Online (Sandbox Code Playgroud) 我的应用程序需要在下载文件夹中的文本文件中保存一个字符串。目前(目标:API 29 (Q) 我正在使用 FILE API 和:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
android:requestLegacyExternalStorage="true"
Run Code Online (Sandbox Code Playgroud)
但是对于 API 30 (R),如果我理解得很好,我必须将其迁移到作用域存储 (MediaStore.Downloads)。
在这里,我有点失落。我在下载中找不到显示如何创建文本文件的好的文档或片段。如果有人可以解释或展示如何做到这一点,我会很高兴吗?
我的应用程序需要备份 WhatsApp 状态、语音注释和图像的功能。如您所知,Android Q 后谷歌强制使用 MediaStore API 访问外部媒体文件。
WhatsApp 还将他们的文件移至/Android/media/com.whatsapp/WhatsApp. 我尝试使用MANAGE_EXTERNAL_STORAGE权限,它工作正常,但备份这些文件不是应用程序的核心功能,所以我认为谷歌不会让我使用此权限。
我想知道是否有任何方法可以使用 MediaStore.VOLUME_EXTERNAL 读取这些文件?
我尝试过这样的事情。我不确定这是否可能。
val collection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL)
val selection= (MediaStore.Files.FileColumns.MEDIA_TYPE + "="
+ MediaStore.Files.FileColumns.MEDIA_TYPE_NONE)
val selectionArgs= arrayOf("%/WhatsApp/Media/.Statuses%")
val cursor = applicationContext.contentResolver.query(
collection, null, selection, selectionArgs, null)
debug(cursor?.columnCount)
cursor?.close()
Run Code Online (Sandbox Code Playgroud)
它抛出异常。
Caused by: android.database.sqlite.SQLiteException: no such column: media_type
Run Code Online (Sandbox Code Playgroud) 我的目标是从应用程序中存储到SD卡上的文件中设置用户通知声音.我正在使用此代码:
if(path != null){
File k = new File(path, "moment.mp3");
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, "My Song title");
values.put(MediaStore.MediaColumns.SIZE, 215454);
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
values.put(MediaStore.Audio.Media.ARTIST, "Some Artist");
values.put(MediaStore.Audio.Media.DURATION, 230);
values.put(MediaStore.Audio.Media.IS_RINGTONE, false);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
values.put(MediaStore.Audio.Media.IS_ALARM, false);
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
values.put(MediaStore.MediaColumns.DISPLAY_NAME, "Some Name");
//Insert it into the database
Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
Uri newUri = MainActivity.this.getContentResolver().insert(uri, values);
RingtoneManager.setActualDefaultRingtoneUri(
MainActivity.this,
RingtoneManager.TYPE_NOTIFICATION,
newUri
);
//RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_NOTIFICATION, newUri);
Toast.makeText(this, "Notification Ringtone Set", Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)
当我在设备上运行时,我不断收到错误:
06-12 15:19:36.741: ERROR/Database(2847): Error inserting is_alarm=false is_ringtone=false artist_id=35 is_music=false album_id=-1 …Run Code Online (Sandbox Code Playgroud) android ×10
mediastore ×10
android-10.0 ×2
java ×2
audio ×1
cursor ×1
image ×1
insert ×1
projection ×1
ringtone ×1
share ×1
sql ×1