标签: mediastore

使用asynctask从内容提供程序加载图像位图

我一直试图通过MediaStore内容提供商查询SD卡上的所有图像,并在GridView上显示它们的缩略图.

但是,如果我在主线程上加载图像缩略图,滚动速度会非常慢......

所以我试图通过asynctasks加载位图:滚动性能变得更好,但现在网格项不断重新加载缩略图,直到它获得正确的位图...

这是我的asynctask,它加载位图:

package x.y;

import java.lang.ref.WeakReference;

import android.content.ContentResolver;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory.Options;
import android.os.AsyncTask;
import android.provider.MediaStore;
import android.widget.ImageView;

public class ImageThumbnailLoader extends AsyncTask<Long, Void, Bitmap> {

    private final Options mOptions;

    private WeakReference<ImageView> mImageViewWeakReference;
    private ContentResolver mContentResolver;

        public ImageThumbnailLoader(ImageView imageView,
                ContentResolver cr) {
        mContentResolver = cr;
        mImageViewWeakReference = new WeakReference<ImageView>(imageView);
        mOptions = new Options();
        mOptions.inSampleSize = 4;
    }



    @Override
    protected Bitmap doInBackground(Long... params) {
        Bitmap result;
            result = MediaStore.Images.Thumbnails.getThumbnail(
                    mContentResolver, params[0],
                    MediaStore.Images.Thumbnails.MINI_KIND, mOptions);
        return result;
    }

    @Override
    protected void …
Run Code Online (Sandbox Code Playgroud)

android bitmap mediastore android-asynctask android-cursoradapter

2
推荐指数
1
解决办法
6740
查看次数

从MediaStore到适配器/列表视图的专辑列表

我能够在mediastore中列出所有歌曲,但我也希望按艺术家/专辑/文件夹/流派/播放列表对它们进行排序.

我通常使用游标查询自己的数据库,但这在这种情况下无效,我必须使用适配器.我可以通过更改参数来查询,但我不知道如何在适配器中对它进行分组(我无法找到如何添加/使用GROUPBY),这意味着我需要适配器中的每个艺术家/专辑/文件夹/ ..只有一次,不是每首歌.

我试图通过互联网搜索,但我找不到答案.我在这里也找到了一些主题,但对我来说还不是很清楚.所以我想请你告诉我这个例子:

package com.exercise.AndroidListMedia;

import android.app.ListActivity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.MediaStore.Video.Media;
import android.view.View;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class AndroidListMediaActivity extends ListActivity {

 SimpleCursorAdapter adapter;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  String[] from = {
    MediaStore.MediaColumns.TITLE};
  int[] to = {
    android.R.id.text1};

  Cursor cursor = managedQuery(
    MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
    null,
    null,
    null,
    MediaStore.Audio.Media.TITLE);

  adapter = new SimpleCursorAdapter(this,
    android.R.layout.simple_list_item_1, cursor, from, …
Run Code Online (Sandbox Code Playgroud)

android listview adapter mediastore

2
推荐指数
1
解决办法
6947
查看次数

从Mediastore排序Android列表中的顺序

我需要在Android上按最新排序的视频库.使用下面的代码,排序是最上面的最旧视频和最后的最新视频.所以我需要在获取新录制的视频之前滚动整个列表.

任何解决这个问题的想法?

 private void init_phone_video_grid() {

    System.gc();
    String[] proj = { MediaStore.Video.Media._ID,
            MediaStore.Video.Media.DATA,
            MediaStore.Video.Media.DISPLAY_NAME,
            MediaStore.Video.Media.SIZE };
    videocursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
            proj, null, null, null);
    count = videocursor.getCount();
    videolist = (ListView) findViewById(R.id.PhoneVideoList);
    videolist.setAdapter(new VideoAdapter(getApplicationContext()));
    videolist.setOnItemClickListener(videogridlistener);


}

private OnItemClickListener videogridlistener = new OnItemClickListener() {
    public void onItemClick(AdapterView parent, View v, int position,
            long id) {
        System.gc();
        video_column_index = videocursor
                .getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
        videocursor.moveToPosition(position);
        String filename = videocursor.getString(video_column_index);



        String videoinfo[] = new String[2];

        int videoId = videocursor.getInt(videocursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));

        Cursor videoThumbnailCursor = managedQuery(MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI,
                thumbColumns, …
Run Code Online (Sandbox Code Playgroud)

sorting video android mediastore

2
推荐指数
1
解决办法
2238
查看次数

如果您有歌曲ID,Android会从Media Store获取歌曲吗?

我从MediaStore的播放列表中获得了歌曲ID,使用

long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID));
Run Code Online (Sandbox Code Playgroud)

并且ID是正确的,但由于仅有的其他可用数据是CONTENT_DIRECTORY,DEFAULT_SORT_ORDER,PLAYLIST_ID,PLAY_ORDER和_ID,因此我不确定如何获取歌曲的重要部分。我需要标题,专辑,艺术家等,就好像我正在通过MediaStore.Audio.Media获取歌曲信息一样。

我找到了一个尝试修改的答案以满足自己的需求,但是我不太了解查询或游标,因此我不确定是否有获取歌曲的方法。

如果唯一的方法是在每首歌曲中循环播放,直到找到匹配的ID,我就可以做到这一点,但是这样做效率低下,必须有更好的方法。

提前致谢!

java search android cursor mediastore

2
推荐指数
1
解决办法
2679
查看次数

从 MediaStore 查询播放列表

我正在尝试从 MediaStore 查询设备中的播放列表。我关注了之前提出的一个问题,但没有得到答案。

这就是我查询播放列表的方式

public void addToPlaylist(long playlistId, Context context,
                          ArrayList<Play> playlistTracks, String playlistName) {
    int count = getPlaylistSize(playlistId, context);
    Log.d("playlist size=", "" + count);

    ContentValues[] values = new ContentValues[playlistTracks.size()];
    for (int i = 0; i < playlistTracks.size(); i++) {
        values[i] = new ContentValues();
        values[i].put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, i
                      + count + 1);
        values[i].put(MediaStore.Audio.Playlists.Members.AUDIO_ID,
                      playlistTracks.get(i).getId());
        values[i].put(MediaStore.Audio.Playlists.NAME, playlistName);
    }
    ContentResolver resolver = context.getContentResolver();
    Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external",
                                                               playlistId);
    int num = resolver.bulkInsert(uri, values); 
    Log.d("songs added=", "" + num); // added
    resolver.notifyChange(Uri.parse("content://media"), null);

}

private …
Run Code Online (Sandbox Code Playgroud)

android arraylist playlists mediastore android-mediaplayer

2
推荐指数
1
解决办法
3118
查看次数

如何从 MediaStore.Images.Media.getBitmap(contentResolver, uri) 获取位图?

我在从 uri 检索位图时遇到困难。我试图通过意图打开相机后获取从相机拍摄的图像。

                    try {
                        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                            imageUri = FileProvider.getUriForFile(mContext, mContext.getApplicationContext().getPackageName(), createImageFile());
                            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);   // set the image file name
                        }
                        startActivityForResult(intent, PERMISSION_REQUEST_CODE_CAMERA);
                    } catch (ActivityNotFoundException e) {
                        e.printStackTrace();
                    }
Run Code Online (Sandbox Code Playgroud)

登录时的 imageUri 是

内容://com.example/external_files/Pictures/CustomFolder/15122017_photo_115344.jpg

打开相机并拍照后,调用我的 onActivityResult 。因为我使用 MediaStore.EXTRA_OUTPUT,所以我的数据对象中没有收到任何内容,它为空。我尝试使用 MediaStore.Images.Media.getBitmap() 来检索位图。我传入 imageUri。我相信这可能不正确,因为我收到了异常。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == PERMISSION_REQUEST_CODE_CAMERA) {
        if (resultCode == Activity.RESULT_OK) {

            Bitmap bitmap;
            try {
                bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), …
Run Code Online (Sandbox Code Playgroud)

android bitmap mediastore android-camera-intent

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

如何在android 10中获取图像的方向信息?

从 android 10 开始,访问媒体文件有一些变化。通过文档https://developer.android.com/training/data-storage/shared/media我已经能够将媒体内容加载到位图中,但我没有得到方向信息。我知道图像的位置信息有一些限制,但是这些 exif 限制是否也会影响方向信息?如果有任何其他方法可以获得图像的方向信息,请告诉我。下面给出了我使用的代码(它总是返回 0 - 未定义的值)。谢谢你。

ContentResolver resolver = getApplicationContext().getContentResolver();
try (InputStream stream = resolver.openInputStream(selectedFileUri)) {
 loadedBitmap = BitmapFactory.decodeStream(stream);
 ExifInterface exif = new ExifInterface(stream);
 orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
}
Run Code Online (Sandbox Code Playgroud)

java android exif mediastore android-10.0

2
推荐指数
1
解决办法
1205
查看次数

在 Android Q 中替换 ContentResolver 查询中的“GROUP BY”(Android 10、API 29 更改)

我正在升级一些旧版本以针对 Android Q,当然此代码停止工作:

       String[] PROJECTION_BUCKET = {MediaStore.Images.ImageColumns.BUCKET_ID,
            MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
            MediaStore.Images.ImageColumns.DATE_TAKEN,
            MediaStore.Images.ImageColumns.DATA,
            "COUNT(" + MediaStore.Images.ImageColumns._ID + ") AS COUNT",
            MediaStore.Files.FileColumns.MEDIA_TYPE,
            MediaStore.MediaColumns._ID};

        String BUCKET_GROUP_BY = " 1) and " + BUCKET_WHERE.toString() + " GROUP BY 1,(2";

        cur = context.getContentResolver().query(images, PROJECTION_BUCKET,
            BUCKET_GROUP_BY, null, BUCKET_ORDER_BY);
Run Code Online (Sandbox Code Playgroud)

android.database.sqlite.SQLiteException:“GROUP”附近:语法错误(代码 1 SQLITE_ERROR[1])

这里它应该获取包含相册名称、日期、图片数量的图像列表 - 每个相册一张图像,因此我们可以创建相册选择器屏幕,而无需查询所有图片并循环遍历它以创建相册。

由于 SQL 查询停止工作,是否可以使用 contentResolver 对查询结果进行分组?

(我知道 ImageColumns.DATA 和“COUNT() AS COUNT”也被弃用,但这是一个关于 GROUP BY 的问题)

(有一种方法可以查询相册并单独查询照片,以获得相册封面的照片uri,但我想避免开销)

mediastore android-contentresolver android-sqlite android-10.0

2
推荐指数
1
解决办法
3901
查看次数

重命名由应用程序在 android 10 中创建的 Mediastore 文件。在 Android API 30 上工作,但在 API 29 中显示错误

在这里,这个 renameFile(..) func 在 Android API 30 中工作。但是,它在 Android API 29 中不起作用并显示如下错误:

java.lang.IllegalArgumentException:不允许移动不属于明确定义集合的内容://media/external/file/116

更新-注意:

---开始---

为了使用 sdk-29,我们必须使用 Uri 作为 extUri = MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL) 像:

private static Uri extUri = MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL);
Run Code Online (Sandbox Code Playgroud)

代替下面的代码。并将MediaStore.Files.FileColumns更新为MediaStore.Downloads

---结束---

Uri extUri = MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL);
String relativeLocation = Environment.DIRECTORY_DOWNLOADS + File.separator + "AppFolder";
Run Code Online (Sandbox Code Playgroud)

函数重命名文件(...)

boolean renameFile(Context context, String newName, String displayName) {

    try {
        Long id = getIdFromDisplayName(displayName);
        ContentResolver contentResolver = context.getContentResolver();
        Uri mUri = ContentUris.withAppendedId(extUri, id);
        ContentValues contentValues = new ContentValues();

        contentValues.put(MediaStore.Files.FileColumns.IS_PENDING, 1);
        contentResolver.update(mUri, contentValues, null, …
Run Code Online (Sandbox Code Playgroud)

java android file-rename mediastore android-10.0

2
推荐指数
1
解决办法
2537
查看次数

如何从Android中的MediaStore.Audio.Playlists中删除播放列表

如果可能,我如何以MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI编程方式删除播放列表?

android mediastore playlist

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