标签: mediastore

在运行 Android 10 以下的设备上将文件保存到 MediaStore

我正在编写用于下载和存储不同类型的 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: …

audio android download mediastore mime-types

5
推荐指数
0
解决办法
1592
查看次数

如何在 DCIM 目录(作用域存储)Android Q 中创建隐藏文件夹,即 .MyFolder [(dot)MyFolder]

我想在 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 的代码

java android file mediastore hidden-files

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

通过 Intent 共享照片时 EXIF 位置数据被删除

我最近将我的应用程序切换到范围存储。但是,我注意到,当我从应用程序内共享图像(通过 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

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

Android 10:contentResolver.delete() 未从文件系统中删除文件

我正在使用 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 中删除

android mediastore android-contentresolver

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

内部vs外部uri从mediastore获取数据

希望有人可以向我澄清这一点......我正在制作一个简单的视频播放器应用程序,播放存储在手机上的视频片段.

我见过的所有示例都使用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个音频和视频播放器的例子,它们都只使用外部.

即使是已检查的股票音乐播放器的源代码,它也只能从外部卡中提取.

android external internal mediastore

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

Android - 使用 Intent 选择要播放的歌曲

我正在尝试使用 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)

android action mediastore android-intent

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

MediaStore.Images.Media.MINI_THUMB_MAGIC有什么作用?

我只是对MediaStore.Images.Media.MINI_THUMB_MAGIC列包含的内容感到好奇.它与图像的缩略图有什么关系吗?谢谢.

android mediastore

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

CursorAdapter如何在GridView中运行android

我在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)

android gridview mediastore android-cursoradapter

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

如何显示歌曲持续时间

所以我使用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 duration mediastore

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

从Android设备android编程获取所有照片

我正在尝试获取我的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 gridview mediastore

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