我希望用户能够从他们的媒体库中选择一张照片,但不希望他们能够选择一个视频.我无法限制他们只选择照片.当我使用打开图库应用程序时
new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
Run Code Online (Sandbox Code Playgroud)
然后他们可以选择照片和视频.有没有办法限制他们只选择照片?
我有兴趣对特定类型的所有专辑进行查询.通过使用Android,可以轻松地对特定艺术家的专辑执行类似的查询MediaStore.Audio.Artists.Albums.getContentUri,但就查询类型而言,MediaStore.Audio.Genres.Members.getContentUri是提供的最佳方式,但这用于从类型中返回歌曲.
您可以在执行Genres.Members查询后轻松返回每个类型成员的MediaStore.Audio.Genres.Members.ALBUM相册名称,然后使用,返回相册名称,但这仅在您显示歌曲时才有用.
是否有某些选择我只能从一个类型中返回专辑,或者也许是Uri我可以使用的特殊专辑?我没有找到任何关于此的文档,所以如果有任何人有任何信息,将非常感谢.
我MediaStore.ACTION_IMAGE_CAPTURE用来拍照,MediaStore.EXTRA_OUTPUT指向Uri存储所有其他照片/视频文件的 DCIM/Camera 目录。
照片文件已成功拍摄,我可以使用 ES 文件资源管理器查看它,并且可以在我的应用程序中查看它。但是当我使用它时它没有显示在画廊中Intent.ACTION_PICK
Intent selectPictureIntent = new Intent(Intent.ACTION_PICK);
selectPictureIntent.setType("image/*");
Run Code Online (Sandbox Code Playgroud)
我已经阅读了有关在图片使用后更新图库的其他主题
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
Run Code Online (Sandbox Code Playgroud)
并且
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, _outputMediaUri);
LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)
这里发生了什么 :(
我想将我的图像设置为音频mp3文件的专辑封面.我知道相册id,当我更新时,应用程序抛出java.lang.UnsupportedOperationException.
这是我的更新代码..
ContentValues values_art=new ContentValues();
values_art.put(MediaStore.Audio.AlbumColumns.ALBUM_ART, img_path);
int b=getContentResolver().update(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, values_art,MediaStore.Audio.Albums.ALBUM_ID + "=?", new String[]{album_id});
if(b !=0){
Toast.makeText(getApplicationContext(), "Successfuly Image Updated", Toast.LENGTH_LONG).show();
}
else{
Toast.makeText(getApplicationContext(), "Not Image Updated", Toast.LENGTH_LONG).show();
}
Run Code Online (Sandbox Code Playgroud)
我的Logcat:
05-11 00:14:33.063: E/AndroidRuntime(4046): FATAL EXCEPTION: main
05-11 00:14:33.063: E/AndroidRuntime(4046): java.lang.UnsupportedOperationException: Unknown or unsupported URL: content://media/external/audio/albums
05-11 00:14:33.063: E/AndroidRuntime(4046): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:169)
05-11 00:14:33.063: E/AndroidRuntime(4046): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
05-11 00:14:33.063: E/AndroidRuntime(4046): at android.content.ContentProviderProxy.update(ContentProviderNative.java:507)
05-11 00:14:33.063: E/AndroidRuntime(4046): at android.content.ContentResolver.update(ContentResolver.java:1022)
05-11 00:14:33.063: E/AndroidRuntime(4046): at fsoft.farhad.mediaeditor.AudioTabActivity$4.onClick(AudioTabActivity.java:89)
05-11 00:14:33.063: E/AndroidRuntime(4046): at android.view.View.performClick(View.java:4212)
05-11 00:14:33.063: E/AndroidRuntime(4046): at android.view.View$PerformClick.run(View.java:17476) …Run Code Online (Sandbox Code Playgroud) 使用file.renameTo(file)它们重命名图像后,它们在图库中变灰并变得不可用。我尝试了各种 Intent 来重新扫描图像,最后没有希望,一些旧版本的工作有些根本不起作用,所以我正在尝试更新MediaStore,但不知道如何正确地做到这一点。
这是我的一些代码
这是我早期的方法之一
MediaScannerConnection.scanFile(mContext,
filesPath , null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
Run Code Online (Sandbox Code Playgroud)
另一个
private void scanMedia(File file) {
Uri uri = Uri.fromFile(file);
Intent scanFileIntent = new Intent(
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
mContext.sendBroadcast(scanFileIntent);
}
Run Code Online (Sandbox Code Playgroud)
这项工作适用于 19 岁之前,但不适用于 kitkat
mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
Run Code Online (Sandbox Code Playgroud)
这是 MediaStore 之一
int row = mContext.getContentResolver()
.update(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
valuesNewFilePath,
MediaStore.MediaColumns.DATA + "='" + oldFilePath + …Run Code Online (Sandbox Code Playgroud) 可能重复但没有找到任何解决方案。
我正在尝试修改图像并将其保存到设备使用MediaStore. 使用以下代码 -:
public class Utils {
private Utils() {
}
static Uri getUri(Context context, Bitmap bitmap) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmap, "Title", null); //returning null in some devices
Log.d("TAG", "getUri: "+path);
return Uri.parse(path); //this is returning null which cause the app crash
}
static Bitmap getBitmap(Context context, Uri uri) throws IOException {
return MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri);
}
}
Run Code Online (Sandbox Code Playgroud)
此代码在大多数设备中运行良好,但问题是MediaStore.Images.Media.insertImage在某些设备中返回 null,例如 -:
1 . 三星J7(2016)
2 . …
我看到很多关于在 android 中将图像保存到图库的讨论,我想知道 MediaStore 是否仍然是一个好的继续方式?
谢谢,
Uri uri = MediaStore.Audio.Artists.Albums.getContentUri("external",
artistId);
String[] projection = new String[] {BaseColumns._ID};
Cursor cursor =
mContext.getApplicationContext().getContentResolver().query
(uri,
projection,
null,
null,
null);
Run Code Online (Sandbox Code Playgroud)
在 Android 10 之前,BaseColumns._ID 返回专辑 ID,现在在 10 中,它返回一些随机 ID。
当我将投影传递为 null 并检索下面的所有列名时,我得到的列名。这是在 Android 10 中。 [numsongs、artist、numsongs_by_artist、album、album_art、album_key、artist_id、maxyear、minyear、album_id]
Android 10 以下没有 _id 列。
要获得 10 中的专辑 ID,我必须使用以下投影
String[] projection = new String[]
{MediaStore.Audio.Artists.Albums.ALBUM_ID};
Run Code Online (Sandbox Code Playgroud)
对于下面相同的 Uri 是我在 Android 10 以下获得的可用列。 [album_art、maxyear、minyear、artist、album、artist_key、numsongs_by_artist、_id、numsongs、album_key、artist]
这里没有专辑_id 列,_id 返回专辑_id。现在在 10 中是不可用的。
现在我需要使用不同的代码来获取专辑 ID,一个用于 Android 10,另一个用于低于 Android 10。
这些变化在 Android 10 行为变化中没有列出。这对我们来说是非常关键的变化,像这样的一个小变化可能会破坏我们每天有 150 万人使用的整个应用程序。
怎么会有人像这样改变而不让开发人员知道呢?(或)我在文档中遗漏了什么。(或)如何跟踪这些更改?
android mediastore android-music-player android-contentprovider android-10.0
更新:
为了保存PDF文件:
在下面的答案部分。
为了保存位图文件:
@RequiresApi(api = Build.VERSION_CODES.Q)
@NonNull
private Uri saveBitmap(@NonNull final Context context, @NonNull final Bitmap bitmap,
@NonNull final Bitmap.CompressFormat format, @NonNull final String mimeType,
@NonNull final String displayName, @Nullable final String subFolder) throws IOException {
String relativeLocation = Environment.DIRECTORY_PICTURES;
if (!TextUtils.isEmpty(subFolder)) {
relativeLocation += File.separator + subFolder;
}
final ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, displayName);
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, relativeLocation);
final ContentResolver resolver = context.getContentResolver();
OutputStream stream = null;
Uri uri = null;
try {
final Uri contentUri …Run Code Online (Sandbox Code Playgroud) 我还是 android 编程的新手。我正在尝试使用 CameraX API 拍照。但是,Google Codelabs的示例代码仅将照片保存在符合Android 的 Scoped Storage的应用程序私有目录中。我对 Mediastore 还不了解,所以请您带我查看有关如何将 Mediastore 集成到 CameraX 的文档吗?