我正在编写用于下载和存储不同类型的 MediaStore 文件的代码。对于运行 Android 10 及更高版本的设备,我将它们全部存储到Downloads集合中,并且工作正常。运行 Android 10 以下的用户没有此集合。一开始我尝试将它们存储到Files集合中,但事实证明不可能将例如图像存储到Files集合中。所以我来到了这段代码:
fun createDownloadsFile(context: Context, fileName: String, mimeType: String): Uri? {
val values = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, fileName)
put(MediaStore.MediaColumns.MIME_TYPE, mimeType)
}
val collection = if (hasAndroid10()) {
values.put(MediaStore.MediaColumns.IS_PENDING, 1)
MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
} else getMediaStoreCollectionBelowAndroid10(mimeType)
return context.contentResolver.insert(collection, values)
}
private fun getMediaStoreCollectionBelowAndroid10(mimeType: String): Uri = when {
mimeType.startsWith("image/") -> MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL)
mimeType.startsWith("audio/") -> MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME_EXTERNAL)
mimeType.startsWith("video/") -> MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL)
else -> MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL)
}
Run Code Online (Sandbox Code Playgroud)
现在,图像和视频在低于 10 的 Android 上可以正常存储。但尝试存储音频时会崩溃contentResolver.insert(collection, values):
java.lang.NullPointerException: …
我想在 DCIM 目录中创建一个隐藏文件夹,即 .MyFolder [(dot)MyFolder]。这是我的代码:-
final String relativeLocation = Environment.DIRECTORY_DCIM+File.separator+".MyFolder/images";
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME,positionOfPager+".jpeg");
contentValues.put(MediaStore.MediaColumns.MIME_TYPE,"image/*");
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH,relativeLocation);
imageUri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues);
fos = (FileOutputStream) context.getContentResolver().openOutputStream(Objects.requireNonNull(imageUri));
inImage.compress(Bitmap.CompressFormat.JPEG,100,fos);
Run Code Online (Sandbox Code Playgroud)
这里的问题是创建一个带有连字符“_.MyFolder”的文件夹,即[(Hypen)(dot)MyFolder],因此该文件夹未被隐藏。我的应用程序正在创建大量图像,我不想在图库中显示这些图像来打扰用户。请帮助我注意:-我正在实现范围存储 android 11 的代码
我最近将我的应用程序切换到范围存储。但是,我注意到,当我从应用程序内共享图像(通过 Intent)时,GPS 位置数据将从图像的 Exif 元数据中删除。我知道范围存储对访问图像的 Exif 位置数据有一些限制,并且我知道该权限<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />,但是添加此权限在共享图像时似乎没有任何效果。知道如何通过 Intent 共享图像,同时保留图像 Exif 数据中的位置数据吗?
这是我的代码:
val imageUri = mediaList[photo_view_pager.currentItem].uri
val intent = Intent().apply {
val mediaType = MimeTypeMap.getSingleton()
.getMimeTypeFromExtension("jpg")
putExtra(Intent.EXTRA_STREAM, imageUri)
type = mediaType
action = Intent.ACTION_SEND
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
}
startActivity(Intent.createChooser(intent, getString(R.string.share_hint)))
Run Code Online (Sandbox Code Playgroud)
预先非常感谢您的帮助!
android geolocation mediastore android-intent scoped-storage
我正在使用 MediaStore.Files 在 InternalStorage/Documents/MyFolderName/xyz.pdf 中创建文件
使用
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.Files.FileColumns.DISPLAY_NAME, fileName);
contentValues.put(MediaStore.Files.FileColumns.MIME_TYPE, fileType);
contentValues.put(MediaStore.Files.FileColumns.IS_PENDING, 1);
contentValues.put(MediaStore.Files.FileColumns.RELATIVE_PATH, dstPublicDirectory + File.separator + dstSubDirectory);
// Getting content uri for the file
Uri dstFileUri = resolver.insert(MediaStore.Files.getContentUri("external"), contentValues);
Run Code Online (Sandbox Code Playgroud)
我能够创建该 xyz.pdf 文件
但是,为了删除我正在使用的文件
getActivity().getContentResolver().delete(fileUriToDelete, null, null);
Run Code Online (Sandbox Code Playgroud)
以上已从 MediaStore.Files 的数据库中删除,但无法删除文件系统中的该文件。
由于该文件仍然在以下位置可用:InternalStorage/Documents/MyFolderName 这种情况仅在 Android 10 中发生。在 Android 11 中,该文件将从文件系统以及 MediaStore.Files db 中删除
希望有人可以向我澄清这一点......我正在制作一个简单的视频播放器应用程序,播放存储在手机上的视频片段.
我见过的所有示例都使用MediaStore.Video.Media.EXTERNAL_CONTENT_URI内容Uri获取视频,类似于
cursor = resolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, cols, whereClause, null, sortOrder);
Run Code Online (Sandbox Code Playgroud)
但它不会将列表限制为只存储在SD卡上的文件吗?
较新的Android手机拥有大量内部存储器 - 例如,三星Galaxy S通常配备16Gb的内部存储器和2Gb SD卡.
我应该使用外部内容uri和内部内容扫描mediastore两次吗?
我再次看到了10个音频和视频播放器的例子,它们都只使用外部.
即使是已检查的股票音乐播放器的源代码,它也只能从外部卡中提取.
我正在尝试使用 Activity 选择一首歌曲,该 Activity 将提供有关歌曲的元信息。我想这样做而不是一个简单的文件浏览器。我有以下代码,但不幸的是,一旦点击它也会播放这首歌。我只是希望用户能够从他们的歌曲中选择一首歌曲,MediaStore然后在不播放的情况下对其进行操作。
public class Main extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_PICK);
intent.setData(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
startActivity(intent);
}
}
Run Code Online (Sandbox Code Playgroud) 我只是对MediaStore.Images.Media.MINI_THUMB_MAGIC列包含的内容感到好奇.它与图像的缩略图有什么关系吗?谢谢.
我在gridview上使用游标适配器时遇到问题,我使用光标从媒体商店加载照片.我意识到我的newView和bindView被完全调用了.我的意思是假设我有500张照片,newView也会被调用相同的次数.
我做错了什么吗?我以为它只会在屏幕上看到细胞时调用..
public int taskA = 0;
public GalleryCursorAdapter(Context context, Cursor c) {
super(context, c);
// TODO Auto-generated constructor stub
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
// TODO Auto-generated method stub
int index = cursor.getColumnIndex(MediaStore.Images.Media._ID);
long id = cursor.getLong(index);
Bundle idBundle = new Bundle();
idBundle.putLong("id", id);
Message msg = new Message();
msg.setData(idBundle);
ImageHandler imgHandler = new ImageHandler(context, (ImageView) view);
imgHandler.sendMessage(msg);
view.setTag(imgHandler);
Log.w("task s", " count");
}
@SuppressLint({ "NewApi", "NewApi" })
@Override
public View newView(Context context, …Run Code Online (Sandbox Code Playgroud) 所以我使用Mediastore获取歌曲持续时间但我需要将它们转换为秒我需要将它们格式化为HH:MM:SS(小时:分钟:秒)我尝试使用TimeUnit但是没有工作或者我没有实现它正确办法
谢谢你的帮助对不起英语不好
请帮忙.SongAdapter.java
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView title1 = (TextView) view.findViewById(R.id.titlelist);
TextView artist1 = (TextView) view.findViewById(R.id.artistlist);
TextView duration1 = (TextView) view.findViewById(R.id.durationlist);
ImageView album1 = (ImageView) view.findViewById(R.id.iconlist);
title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
String duration = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
long albumId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));
StringBuilder titleBuild = new StringBuilder();
titleBuild.append(title);
if(titleBuild.length() > 35)
{
titleBuild.setLength(32);
title = titleBuild.toString()+"...";
}
else
{
title = titleBuild.toString();
}
StringBuilder artistBuild = new StringBuilder();
artistBuild.append(artist);
if(artistBuild.length() …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取我的Android设备的所有照片.
我有一个onCreate功能:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageAdapter adapter= new ImageAdapter(this);
final String[] columns = { MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID };
final String orderBy = MediaStore.Images.Media._ID;
Uri rr= MediaStore.Images.Media.INTERNAL_CONTENT_URI;
Cursor imagecursor = getContentResolver().query(
MediaStore.Images.Media.INTERNAL_CONTENT_URI,null, null,
null, orderBy);
int image_column_index = imagecursor.getColumnIndex(MediaStore.Images.Media._ID);
this.count = imagecursor.getCount();
this.thumbnails = new Bitmap[this.count];
for (int i = 0; i < this.count; i++) {
imagecursor.moveToPosition(i);
int id = imagecursor.getInt(image_column_index);
thumbnails[i] = MediaStore.Images.Thumbnails.getThumbnail(
getApplicationContext().getContentResolver(), id,
MediaStore.Images.Thumbnails.MICRO_KIND, null);
adapter.mThumbIds[i]= thumbnails[i];
}
}
Run Code Online (Sandbox Code Playgroud)
返回的计数返回imageCursor.getCount()0.
有人可以指导我,因为我无法使用此代码获取任何媒体? …
android ×10
mediastore ×10
gridview ×2
action ×1
audio ×1
download ×1
duration ×1
external ×1
file ×1
geolocation ×1
hidden-files ×1
internal ×1
java ×1
mime-types ×1