标签: mediastore

Android MediaStore插入图像创建的附加文件

我使用以下代码片段在MediaStore缓存中插入一个Image:

__CODE__

插入没问题,但它也在同一路径上创建了另一个图像缩略图.这在图库中不可见,但在使用文件浏览器浏览时,此图像缩略图可见.如何在此处停止创建此图像缩略图,以免混淆用户.

android image insert mediastore

3
推荐指数
1
解决办法
6027
查看次数

通过Android Cursor的文件扩展名(或替代地,文件类型)筛选managedQuery

我想使用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文件也按字母顺序排序但我希望整个列表都是按字母顺序排列的,无论文件类型如何.

我知道有人在这里可以轻松回答这个问题 - >提前谢谢!!!

sql android projection cursor mediastore

3
推荐指数
1
解决办法
1925
查看次数

MediaStore获取图像高度/宽度

我正在查询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)

android mediastore android-mediascanner

3
推荐指数
2
解决办法
4688
查看次数

从mediastore获取音频文件路径或URI

我正在制作一个应用程序,将设备上的所有歌曲列在屏幕上并点击它们打开一个共享意图,其中歌曲/音频文件可以通过各种设备通过蓝牙,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)

audio android share mediastore

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

在 Android 10 上将视频保存并插入到图库

我正在尝试将视频保存到图库,以下代码适用于除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)

java android mediastore android-mediascanner android-10.0

3
推荐指数
2
解决办法
6927
查看次数

安卓 10. 媒体商店。获取所有图像

我尝试获取所有图像。我使用这个代码:

 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 mediastore android-10.0

3
推荐指数
1
解决办法
3361
查看次数

IllegalArgumentException:无效的列 DISTINCT bucket_display_name

我正在检索不同文件夹列表,其中包含每个文件夹中包含视频数量的视频文件,这在具有 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)

java android mediastore android-studio

3
推荐指数
1
解决办法
2514
查看次数

Android R – 使用 Scoped 存储 (MediaStore.Downloads) 在下载文件夹中创建一个文本文件

我的应用程序需要在下载文件夹中的文本文件中保存一个字符串。目前(目标: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)。

在这里,我有点失落。我在下载中找不到显示如何创建文本文件的好的文档或片段。如果有人可以解释或展示如何做到这一点,我会很高兴吗?

android mediastore scoped-storage

3
推荐指数
1
解决办法
3403
查看次数

是否可以使用 MediaStore.VOLUME_EXTERNAL 获取 WhatsApp 媒体文件

我的应用程序需要备份 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)

android mediastore android-external-storage

3
推荐指数
1
解决办法
3994
查看次数

从SD卡文件设置铃声通知

我的目标是从应用程序中存储到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 mediastore ringtone

2
推荐指数
3
解决办法
7252
查看次数