我直接管理应用程序的媒体(图像,声音),读取并保存到SD卡。我应该改为使用MediaStore吗?我不太确定MediaStore的用途,并且javadoc并不是很有帮助。
应用何时应使用MediaStore?简要概述MediaStore的优缺点将不胜感激。
我制作了一个程序,该程序使用存储在设备上的视频填充列表视图并播放它们。它还尝试使用 file.delete 函数来实现删除文件的功能。但是,使用 notifydatasetchange() 函数后,该文件仍显示在列表视图中。此外,我刚刚注意到视频文件已从 DCIM 文件夹中删除;但是,它显示在设备的图库中,但是当您单击它时,无法播放.. 这是我向用户显示对话框的部分代码,当用户单击 Yes 时,然后执行删除功能。
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
file.delete();
adapter.notifyDataSetChanged();
//list.setAdapter(adapter);
break;
case DialogInterface.BUTTON_NEGATIVE:
image2.setImageResource(R.drawable.play);
flag.setText("play");
//No button clicked
break;
}
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("This Item will be Deleted\nAre you sure?").setPositiveButton("Yes", dialogClickListener)
.setNegativeButton("No", dialogClickListener).show();
}// else closes
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会这样。有什么有用的建议请...
我有一个非常基本的要求。我需要从我可以使用的设备相机中获取的最后一张图像(及其缩略图)。
我使用以下代码来获取图像缩略图:
String[] projection={MediaStore.Images.Thumbnails._ID,MediaStore.Images.Thumbnails.IMAGE_ID,
MediaStore.Images.Thumbnails.KIND,MediaStore.Images.Thumbnails.DATA};
Cursor cursor=MediaStore.Images.Thumbnails.queryMiniThumbnails(getContentResolver(),MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, MediaStore.Images.Thumbnails.MINI_KIND, projection);
Run Code Online (Sandbox Code Playgroud)
以下是实际图像:
String[] largeimage_projection={MediaStore.Images.ImageColumns._ID,MediaStore.Images.ImageColumns.DATA,};
String largeFileSort=MediaStore.Images.ImageColumns._ID+" DESC";
Cursor cursor=getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, largeimage_projection, null, null, sort);
Run Code Online (Sandbox Code Playgroud)
但是,在我的 Samsung Galaxy Tab 8.9 上运行该应用程序时,出现以下错误:
对于缩略图:
没有内容条目://media/external/images/Thumnails/0
对于图像:
内容无条目://media/external/images/media/0
在检查设备时,我发现图像的默认位置是“/mnt/sdcard/DCIM/Camera/”
此外,我无法使用 onActivityResult() 方法中返回的“intent.getExtras()”,因为我的选项卡总是将其设为 null。
谁能告诉我我哪里出错了?谢谢。
我正在按照此处的代码使用Google Glass相机拍摄图像.
https://developers.google.com/glass/develop/gdk/media-camera/camera#capturing_images_or_video
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
Run Code Online (Sandbox Code Playgroud)
一切都运行正常,但相机活动要求用户"点击接受".大概一秒钟之后可以拍照吗?
这就是内置相机应用程序的工作原理,我只是说"好的玻璃,拍照",它拍摄的照片无需任何额外的确认.我的应用程序中的摄像头已经被用户激活,界面中有其他语音/点击,因此第二次确认点击是不合需要的.
在我的其中一台设备上,以下代码无法让我的视频出现在图库中:
File file = new File(path);
Uri uri = Uri.fromFile(file);
Intent scanFileIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
activity.sendBroadcast(scanFileIntent);
Run Code Online (Sandbox Code Playgroud)
所以我scanFile明确使用:
android.media.MediaScannerConnection.scanFile(activity, new String[]{file.getAbsolutePath()},
new String[]{"video/" + mMimeType}, null);
Run Code Online (Sandbox Code Playgroud)
当我的视频为xxx.mpeg4时,值为mMimeTypemp4,结果是视频可以出现在MediaStore中,但是后面获取不到时长(返回值一直为0)。在这方面需要帮助。
public static long[] getVideoDetail(Context context, Uri uri) {
long[] result = new long[] {DEFAULT_VIDEO_FRAME_WIDTH, DEFAULT_VIDEO_FRAME_HEIGHT, -1};
if(uri == null || (!ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()))) {
return result;
}
String[] projection = new String[] {MediaStore.Video.Media.RESOLUTION, MediaStore.Video.VideoColumns.DURATION};
Cursor cursor = null;
boolean success = false;
try {
cursor = context.getContentResolver().query(uri, projection, null, null, null); …Run Code Online (Sandbox Code Playgroud) 我正在尝试将用户创建的位图保存到设备上的默认“图片”文件夹中。我将从似乎是更常见方法的选项开始:
public void saveImageToExternalStorage(String filename, Bitmap image) {
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator;
try {
File directory = new File(path);
if (!directory.exists()) {
directory.mkdirs();
}
File file = new File(directory, filename + ".jpeg");
file.createNewFile();
OutputStream outputStream = new FileOutputStream(file);
image.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.flush();
outputStream.close();
} catch (IOException exception) {
exception.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
这应该保存到“图片”文件夹中,但Environment.getExternalStorageDirectory().getAbsolutePath()似乎创建了一个这样的新文件结构file://storage/emulated/11/Pictures/并将图片保存到那个文件夹中。我也试过Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)同样的结果。但这不是我的任何测试设备或模拟器上的默认“图片”文件夹。这让我寻找其他方法,我发现了这个:
public void saveImageToExternalStorage(String filename, Bitmap image) {
try {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, filename);
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); …Run Code Online (Sandbox Code Playgroud) 我从媒体商店中检索以下值
MediaStore.Images.Media.DATE_TAKEN
MediaStore.Images.Media.DATE_MODIFIED
Run Code Online (Sandbox Code Playgroud)
并从结果中读取日期,如下所示:
int dateTakenColumn = cursor.getColumnIndex(MediaStore.Images.Media.DATE_TAKEN);
int dateModifiedColumn = cursor.getColumnIndex(MediaStore.Images.Media.DATE_MODIFIED);
String dateToken = cursor.getString(dateTakenColumn);
String dateModified = cursor.getString(dateModifiedColumn);
long lDateToken = dateToken != null ? Long.parseLong(dateToken) : 0;
long lDateModified = dateModified != null ? Long.parseLong(dateModified) : 0;
Run Code Online (Sandbox Code Playgroud)
并且可以看到以下行为(示例值):
lDateToken 如下所示:1450696995000 <= 正确lDateModified 如下所示:1450696995 <= 错误好像修改日期都被截断了。我用文件浏览器检查了真实文件的最后修改日期,这些值应该没问题,但我总是从我的媒体文件中得到这么短的数字。
关于为什么会发生这种情况的任何想法?
PS:检查了这个http://developer.android.com/reference/android/provider/MediaStore.Images.ImageColumns.html,但修改后的字段没有在那里列出......
我目前在我的文件提供程序上使用内容 URI 来检索ACTION_IMAGE_CAPTURE意图返回的相机图像。这工作正常。
出于某种奇怪的原因,尝试从相机检索视频文件时,相同的调用不起作用。
destinationFile = File.createTempFile("video", ".mp4", this.getFilesDir());
Uri uri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", destinationFile);
Intent cameraIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
cameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
cameraIntent.setClipData(ClipData.newRawUri(null, uri));
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(cameraIntent, ID);
Run Code Online (Sandbox Code Playgroud)
当目的返回时onActivityResult(),destinationFile 为空。
简单地替换MediaStore.ACTION_VIDEO_CAPTURE由MediaStore.ACTION_IMAGE_CAPTURE给我预期的行为:所拍摄的图像保存在destinationFile。
这发生在 Nexus 设备和默认的 Google 相机应用程序上的库存 Android 6.0.1 上。
视频捕获真的不支持内容 URI 吗?我宁愿不在可公开访问的目录中使用文件 URI。
camera android video-capture mediastore android-fileprovider
我通过存储在 MediaStore 中将位图附加到 Imageview。它在 android 10 以下的所有设备上都可以正常工作,但是当像素发生崩溃时。我的 android id 定位到 sdk 28
try {
Bitmap thePic = MediaStore.Images.Media.GetBitmap(ContentResolver, croppedPicUri);
if(thePic != null){
imgProfileIcon.SetImageBitmap(thePic);
//mediaStorageDir = Environment.GetExternalStoragePublicDirectory(Environment.DirectoryDcim);
mediaStorageDir = GetExternalFilesDir(Environment.DirectoryPictures);
if (!mediaStorageDir.Exists())
{
mediaStorageDir.Mkdirs();
}
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").Format(new Java.Util.Date());
sendFile = new File(mediaStorageDir.Path + File.Separator + "IMG_" + timeStamp + ".png");
String path_ = MediaStore.Images.Media.InsertImage(this.ContentResolver, thePic, "Title", null);
if (path_ != null){
Uri tempUri = Uri.Parse(path_);
path = GetPathToImage(tempUri);
}
}
} catch …Run Code Online (Sandbox Code Playgroud) 我正在使用以下内容将在我的应用程序中创建的图像存储在 Android 库中:
MediaStore.Images.Media.insertImage(contentResolver, bitmap, "SomeTitle", "Description");
Run Code Online (Sandbox Code Playgroud)
这会将图像存储在图片设备文件夹中并将它们添加到图库中。
我现在想为我的应用程序创建一个特定的图像文件夹,以便图像存储在文件夹“MyApp”而不是“Picture”中。我怎样才能做到这一点?
mediastore ×10
android ×9
camera ×2
image ×2
bitmap ×1
delete-file ×1
gallery ×1
google-glass ×1
listview ×1
media ×1
save ×1
video ×1
xamarin ×1