我一直试图通过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
我能够在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上按最新排序的视频库.使用下面的代码,排序是最上面的最旧视频和最后的最新视频.所以我需要在获取新录制的视频之前滚动整个列表.
任何解决这个问题的想法?
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) 我从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,我就可以做到这一点,但是这样做效率低下,必须有更好的方法。
提前致谢!
我正在尝试从 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) 我在从 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 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) 我正在升级一些旧版本以针对 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
在这里,这个 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) 如果可能,我如何以MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI编程方式删除播放列表?