标签: android-contentresolver

从contentResolver删除文件仅从数据库中删除条目(不是文件)

我尝试使用contentResolver删除文件,但仅从数据库而不是实际文件中删除条目。因此,我尝试先删除条目,然后再删除文件:

int rows = context.getContentResolver().delete(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
MediaStore.Audio.Media._ID + "=" + idSong, null);

// Remove file from card
if (rows != 0) {
Uri uri = ContentUris.withAppendedId(
        MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, idSong);
File f = new File(uri.getPath());
if(!f.delete())
    Log.d("fail-2", "fail-2");  
}
else
Log.d("fail-1", "fail-1");
Run Code Online (Sandbox Code Playgroud)

...,输出为“ fail-2”。为什么?

为什么ContentResolver不删除真实文件?这正常吗?

android mediastore android-contentresolver

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

使用 MediaStore.Images 和 contentResolver 获取存储在设备上的图像时,“没有 content://media/external/images/media/0 条目”

我有一个非常基本的要求。我需要从我可以使用的设备相机中获取的最后一张图像(及其缩略图)。

我使用以下代码来获取图像缩略图:

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。

谁能告诉我我哪里出错了?谢谢。

android mediastore android-contentresolver

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

ContactResolver.applyBatch(...)有时会返回空结果

我正在通过以下方式将jsonned联系人添加到我的Android设备中(请注意下面的代码是草案 - 它可能包含一些低效的内容);

    ...

    if(!is_duplicated)
    {                   
        String firstName = p_contact.getContactFirstName();
        String middleName = p_contact.getContactMiddleName();
        String lastName = p_contact.getContactLastName();
        String orgName = p_contact.getOrganizationName();           

        boolean isFirstNameNull = (firstName != null && firstName.equalsIgnoreCase("null"));
        boolean isMiddleNameNull = (middleName != null && middleName.equalsIgnoreCase("null"));
        boolean isLastNameNull = (lastName != null && lastName.equalsIgnoreCase("null"));
        boolean isOrgNameNull = (orgName != null && orgName.equalsIgnoreCase("null"));

        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
        ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
               .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
               .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
               .build());

        //----------------- Names 
        if(!isFirstNameNull && !isMiddleNameNull && !isLastNameNull) // 111
        {
           ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                   .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                   .withValue(ContactsContract.Data.MIMETYPE,
                           ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) …
Run Code Online (Sandbox Code Playgroud)

android android-contentresolver android-contacts

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

Android:ContentResolver.update() 究竟做了什么?

我想使用ContentResolver.update(Uri uri, ContentValues values, String where, String[] selectionArgs) 我知道如何使用它的方法,但我想知道它对 ContentValues 做了什么。它是覆盖所有现有的 ContentValues,还是只覆盖给定的 ContentValues?

例如,这些 ContentValues 存在:

A: abc
B: 123
C: 456
Run Code Online (Sandbox Code Playgroud)

update()方法中的 ContentValues包含以下内容:

A: asdf
C: 789
Run Code Online (Sandbox Code Playgroud)

那么新的 ContentValues 将是:(仅覆盖给定的值)

A: asdf
B: 123
C: 789
Run Code Online (Sandbox Code Playgroud)

或者会是:(覆盖所有值)

A: asdf
C: 789
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

 contentResolver.update(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values, "_data=" + audioFilePath, null);
Run Code Online (Sandbox Code Playgroud)

其中values包含ContentValues应该被覆盖的 并且audioFilePath包含音频文件的路径(这是 的值_data)。

android android-contentresolver android-sqlite

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

Android:联系人列表有重复的名字

我有一个按排序顺序的联系人列表。但是在我的联系人列表中,名称与相同的号码重复。我认为问题是因为联系人列表与不同帐户同步。

我用哈希图检查。但是当我使用哈希映射时,结果没有按 name 排序。

private static final String[] PROJECTION = new String[] {
    ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
    ContactsContract.Contacts.DISPLAY_NAME,
    ContactsContract.CommonDataKinds.Phone.NUMBER
};

ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, PROJECTION,
  null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE ASC");

if (cursor != null) {
    try {
        int nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
        String nameContact = cursor.getString(nameIndex);
    finally {
        cursor.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

适配器

holder.name.setText(itemListPogo.get(position).getItemName());
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助避免名称重复。

android android-contentresolver android-contentprovider android-contacts

5
推荐指数
2
解决办法
4050
查看次数

从ContentResolver.query()获取URI

我正在查询Images表格以获取MediaStore.Images.Media.EXTERNAL_CONTENT_URI目录中的所有图片.

请参阅以下查询:

String[] what = new String[]{ MediaStore.Images.ImageColumns.DATE_TAKEN,
            MediaStore.Images.ImageColumns._ID,
            MediaStore.Images.ImageColumns.MIME_TYPE,
            MediaStore.Images.ImageColumns.DATA };

String where = MediaStore.Images.Media.MIME_TYPE + "='image/jpeg'" +
            " OR " + MediaStore.Images.Media.MIME_TYPE + "='image/png’";

Cursor cursor = getContext().getContentResolver()
                    .query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
                            what,
                            where,
                            null,
                            MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC”);
Run Code Online (Sandbox Code Playgroud)

现在,我想让Uri指向每个结果.这就是我现在正在做的事情:

int dataIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
String path = cursor.getString(dataIndex);
final Uri uri = Uri.fromFile(new File(path));
Run Code Online (Sandbox Code Playgroud)

例如,我从DATA列中获取路径,创建一个文件并使用Uri.fromFile.我有两个问题.

  1. 这保证有效吗?以上查询是否保证返回数据列中的路径?它适用于我手机中的所有图片:path总是一个路径,就像/storage/0/whatever.jpg,并且uri.toString()与文件方案相同.尽管如此,图片很好地可以通过content:// uris来定义,但是我没有看到它们如何(以及如果)在图像表中表示.

  2. 如果没有,我应该在DATA专栏中看到什么,以及如何从中获取Uri?

android uri android-contentresolver android-contentprovider

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

Sporadic IllegalArgumentException:未知的URL内容://

很少得到:

Fatal Exception: java.lang.IllegalArgumentException: Unknown URL content://com.example.provider/info  
    at android.content.ContentResolver.insert(ContentResolver.java:1252)

Fatal Exception: java.lang.IllegalArgumentException: Unknown authority com.example.provider
    at android.content.ContentResolver.applyBatch(ContentResolver.java:1247)
Run Code Online (Sandbox Code Playgroud)

很少强调.一般工作正常没有问题,所以当局设置得很好,但这种情况每隔一段时间就会出现无缘无故.是否有原因导致ContentResolver无法找到ContentProvider(即如果尚未设置)?

android android-contentresolver android-contentprovider

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

Android:通过content:// URI从第三方应用程序(例如WhatsApp)获取图像位图

我正在尝试从第三方应用程序(例如WhatsApp)到我的应用程序(正在棉花糖上测试)的图像。当我从WhatsApp中“共享图像”并与我的应用程序共享时,我得到的URI如下所示:

content://com.whatsapp.provider.media/item/61025
Run Code Online (Sandbox Code Playgroud)

但是在我的应用中,当我调用getContentResolver().openInputStream(uri)getContentResolver().openFileDescriptor(uri, "r")使用上面的URI时,它崩溃并发生以下异常:

java.lang.SecurityException:权限拒绝:从ProcessRecord {a4b804a 30321:com.myapp / u0a145}(pid = 30321,uid = 10145)打开未从uid 10083导出的提供者com.whatsapp.MediaProvider

到目前为止我尝试过的

我在SO上查找此异常,并发现了类似的问题,但要从Google相册导入图像,并需要添加权限,例如:

<uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>

但这并不让您感到困惑,因为可能有许多应用程序,并且需要为每个应用程序或其他内容添加权限。

在其他一些答案中,建议立即从内容提供者读取/复制数据。但不确定如何。因为我openInputStream本身就有例外。

我还必须提到,WhatsApp图像可以成功与其他应用程序(例如Google云端硬盘)共享,因此必须有某种方法可以做到这一点。

请有人可以提供共享提示或可行的解决方案吗?

android android-contentresolver android-permissions android-6.0-marshmallow

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

内容解析器返回错误的大小

我正在从图库中选择图像,并通过ContentResolverAPI 查询其大小,它返回29kb。

但是,当我使用adb通过adb检查文件时,文件大小ls -al为44kb

这是我查询图像尺寸的方法:

    private fun getFileInfo(contentResolver: ContentResolver, fileUri: Uri): Pair<String, Long>? {
    val projection = arrayOf(MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.SIZE)
    val metaCursor = contentResolver.query(fileUri, projection, null, null, null)
        metaCursor?.use {
            if (it.moveToFirst()) {
                val displayNameIndex = it.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME)
                val sizeIndex = it.getColumnIndex(MediaStore.MediaColumns.SIZE)
                return Pair(it.getString(displayNameIndex), it.getLong(sizeIndex))
            }
    }
    return null
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Oreo模拟器。我还通过模拟器的工具进行了检查,另一方面,文件浏览器显示为29kb,而文件详细信息显示为45kb。到底是怎么回事?

这是文件浏览器中的图像:

摘要

细节

另一个注意事项,每次在带有Android 26-Oreo模拟器的模拟器上使用相机应用程序时,上述情况都可以重现,但是对于Android 25-Nougat模拟器也可以。

我已经检查过,新的Document API也返回29kb

android android-contentresolver

5
推荐指数
2
解决办法
395
查看次数

如何从Android Oreo(8.1)或更高版本中的URI获取文件路径

预期的行为

当我选择存储在"下载"中的文件时,它应该能够检索其文件名和路径

实际行为

当我选择存储在"下载"中的文件时,它返回null.

重现问题的步骤

  1. 调用pick文件方法时,它会在Android中显示文件夹
  2. 转到下载,选择一个文件
  3. 它从URI获取实际路径时返回null

这是我实现的代码

public static String getPath(final Context context, final Uri uri) {
   String id = DocumentsContract.getDocumentId(uri);
   if (!TextUtils.isEmpty(id)) {
      if (id.startsWith("raw:")) {
          return id.replaceFirst("raw:", "");
      }
      try {
         final boolean isOreo = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
         String stringContentURI;
         Uri contentUri;
         if(isOreo){ 
            stringContentURI = "content://downloads/my_downloads";
         }else{
            stringContentURI = "content://downloads/public_downloads";
         }
         contentUri = ContentUris.withAppendedId(
                    Uri.parse(stringContentURI), Long.valueOf(id));
         return getDataColumn(context, contentUri, null, null);
      } catch (NumberFormatException e) {
         return null;
      }
   }
}

public static String getDataColumn(Context context, …
Run Code Online (Sandbox Code Playgroud)

android uri android-contentresolver android-fileprovider android-8.1-oreo

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