我尝试使用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不删除真实文件?这正常吗?
我有一个非常基本的要求。我需要从我可以使用的设备相机中获取的最后一张图像(及其缩略图)。
我使用以下代码来获取图像缩略图:
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。
谁能告诉我我哪里出错了?谢谢。
我正在通过以下方式将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) 我想使用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)。
我有一个按排序顺序的联系人列表。但是在我的联系人列表中,名称与相同的号码重复。我认为问题是因为联系人列表与不同帐户同步。
我用哈希图检查。但是当我使用哈希映射时,结果没有按 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
我正在查询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.我有两个问题.
这保证有效吗?以上查询是否保证返回数据列中的路径?它适用于我手机中的所有图片:path总是一个路径,就像/storage/0/whatever.jpg,并且uri.toString()与文件方案相同.尽管如此,图片很好地可以通过content:// uris来定义,但是我没有看到它们如何(以及如果)在图像表中表示.
如果没有,我应该在DATA专栏中看到什么,以及如何从中获取Uri?
很少得到:
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(即如果尚未设置)?
我正在尝试从第三方应用程序(例如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
我正在从图库中选择图像,并通过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
预期的行为
当我选择存储在"下载"中的文件时,它应该能够检索其文件名和路径
实际行为
当我选择存储在"下载"中的文件时,它返回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