我想知道如何最好地实现只读的ContentProvider.我希望我的数据源只能通过我的ContentProvider的其他特殊方法(我当然无法通过ContentResolver访问)在我自己的应用程序中进行修改.换句话说,其他应用程序应该只能使用我的ContentProvider的查询方法,但不能使用插入,删除或更新.
显而易见的解决方案似乎是返回null/0/0并且在insert/delete/update中不执行任何操作.是不是总是在这些方法中抛出异常,以便清楚地表明不允许这些操作?或者是否有可能仅通过权限将对ContentProvider的访问限制为查询方法?
permissions android readonly android-contentresolver android-contentprovider
如何使用内容解析器更新多个记录的一个特定列?
update(Uri uri, ContentValues values, String where, String[] selectionArgs)
Run Code Online (Sandbox Code Playgroud)
上面的函数是否要求我重写contentValues对象中每条记录的所有值?当我使用这个函数只有一个值,如:
ContentValues value = new ContentValues();
value.put (Voicemails.IS_READ, 1 );//mark as read
int iRowsUpdated=contentResolver.update(uri, value, null, null);
Run Code Online (Sandbox Code Playgroud)
然后我得到异常"无法更新URI:content://com.android.voicemail/voicemail?...不支持批量更新",这可能是因为"where"设置为null;
一个教程提到"要批量更新一组记录到Content provider,请调用ContentResolver.update()方法,并使用要更改的列和值."
但是我无法做到这一点......我仍然不知道如何只更新所有记录的一列,基本上我需要将阅读的语音邮件标记为已读.
我想在listview中显示带有专辑名称的专辑封面.但我没有得到显示专辑封面的方式.我试过从android上的封面艺术.
这是我的代码:
Cursor cursor = managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, null, null, null, null);
if (cursor == null)
{
//Query Failed , Handle error.
}
else if (!cursor.moveToFirst())
{
//No media on the device.
}
else
{
int titleColumn = cursor.getColumnIndex(android.provider.MediaStore.Audio.Albums.ALBUM_ART);
int id = cursor.getColumnIndex(android.provider.MediaStore.Audio.Albums.ALBUM_ID); //here value i m getting -1 .
for(int i=0;i<cursor.getCount();i++)
{
if(id<0)
{
Long album =Long.parseLong(cursor.getString(id));
String coverPath = cursor.getString(titleColumn);
Context context = null;
ContentResolver res = context.getContentResolver();
Uri uri = ContentUris.withAppendedId(sArtworkUri, album);
if (uri != null)
{ …Run Code Online (Sandbox Code Playgroud) android albumart mediastore android-contentresolver android-mediaplayer
我想编写与Contacts相关的应用程序.
场景:

查看联系号码,以便用户可以单击其中任何一个
我的应用程序将打开.
这是我到目前为止的地方:我在清单文件中添加了以下内容 -
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/name" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)
结果是我可以看到所有联系人的MyApp图标,而不仅仅是电话号码,当我选择它时,我可以看到联系人姓名而不是可用的号码.

我必须添加到AndroidManifest以便查看联系人电话号码或在其中放置自定义文本?
android dialog android-manifest android-contentresolver android-contacts
我写了一个短信应用程序,在概述中显示了我的联系人的联系人照片.
获得"正常"照片是没有问题的:
Uri cu = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
final InputStream input = Contacts.openContactPhotoInputStream(getContext().getContentResolver(), cu);
return BitmapFactory.decodeStream(input);
Run Code Online (Sandbox Code Playgroud)
问题是:例如facebook提供的联系人照片不存在,我怎样才能获得这些"外部"照片?
我尝试获取所有联系人姓名和号码,我正在尝试使用,getContentResolver但我得到了
方法获取内容解析器()未定义类型
这个错误.
我该如何解决?
以下是代码:
public class ContactManager {
public ArrayList<Product> getContactNumber() {
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,
null, null);
while (phones.moveToNext()) {
String name = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phoneNumber = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
phones.close();
}
Run Code Online (Sandbox Code Playgroud)
}
我注意到MediaStore.Images.ImageColumns的一个奇怪的列叫做" MINI_THUMB_MAGIC ".
文档说的只是:
迷你拇指id.
类型:INTEGER
常数值:"mini_thumb_magic"
我的猜测是这个字段与MediaStore.Images.Thumbnails有关.
这是对的吗 ?如果没有,这是什么以及如何使用它?
如果它是正确的,我还有其他相关的问题:
它是原始图像的迷你尺寸图像吗?它使用相同的宽高比还是对它进行中心裁剪?
为什么"MICRO"的大小是方形(96 x 96),"MINI"的大小是非方形矩形(512 x 384)?
你如何使用它?我的猜测是,它是通过使用"做THUMB_DATA ",这是一个blob,所以你使用它像这样,但是那又有什么用"的宗旨getThumbnail "如果你已经有了这个领域?
如果方向值不为0,它会获得旋转的缩略图吗?意思是如果我想展示它,我不需要旋转图像?
是否可以与缩略图一起查询图像?也许使用内连接?
它适用于所有Android设备和版本吗?
为什么它甚至被称为"魔术"?是因为它也适用于视频(由于某种原因,音乐不存在,例如,它可能是专辑的封面照片)?
sql android mediastore android-contentresolver android-gallery
我正在尝试使用Glide加载带有URI"content://com.android.contacts/contacts/295"的联系人照片.
我用的时候
Glide.with(context).load(Uri.parse(contactPhoto).into(imageview)
Run Code Online (Sandbox Code Playgroud)
Glide给了我一个FileNotFoundException
java.io.FileNotFoundException: File does not exist; URI: content://com.android.contacts/contacts/264, calling user: android.uid.shared:10006, calling package is one of: [com.android.providers.contacts, com.android.contacts, com.android.providers.userdictionary]
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:146)
at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:689)
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1080)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:921)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:848)
at com.bumptech.glide.load.data.FileDescriptorLocalUriFetcher.loadResource(FileDescriptorLocalUriFetcher.java:21)
at com.bumptech.glide.load.data.FileDescriptorLocalUriFetcher.loadResource(FileDescriptorLocalUriFetcher.java:14)
at com.bumptech.glide.load.data.LocalUriFetcher.loadData(LocalUriFetcher.java:44)
at com.bumptech.glide.load.model.ImageVideoModelLoader$ImageVideoFetcher.loadData(ImageVideoModelLoader.java:83)
at com.bumptech.glide.load.model.ImageVideoModelLoader$ImageVideoFetcher.loadData(ImageVideoModelLoader.java:53)
at com.bumptech.glide.load.engine.DecodeJob.decodeSource(DecodeJob.java:170)
at com.bumptech.glide.load.engine.DecodeJob.decodeFromSource(DecodeJob.java:128)
at com.bumptech.glide.load.engine.EngineRunnable.decodeFromSource(EngineRunnable.java:122)
at com.bumptech.glide.load.engine.EngineRunnable.decode(EngineRunnable.java:101)
at com.bumptech.glide.load.engine.EngineRunnable.run(EngineRunnable.java:58)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
at com.bumptech.glide.load.engine.executor.FifoPriorityThreadPoolExecutor$DefaultThreadFactory$1.run(FifoPriorityThreadPoolExecutor.java:52)
Run Code Online (Sandbox Code Playgroud)
显然Glide试图从错误的地方获取图像.
如果有人指出我如何使用"content://"URI加载照片,我将不胜感激.
android android-contentresolver android-contentprovider android-contacts android-glide
在此处查看 Android Q中引入的存储访问更改后,默认情况下现在会删除位置信息。
Google要求我们以setRequireOriginal()媒体的uri作为参数调用“ MediaStore”对象。当您一张一张地获取媒体时,此方法有效,但是当我们查询整个画廊的ContentResolver时该怎么办?
请参阅此示例:
String[] projection = {
MediaStore.Files.FileColumns._ID,
MediaStore.Files.FileColumns.DATA,
MediaStore.Files.FileColumns.MEDIA_TYPE,
MediaStore.Images.Media.DATE_TAKEN,
MediaStore.Images.Media.WIDTH,
MediaStore.Images.Media.HEIGHT,
MediaStore.Images.Media.LATITUDE, // <----- THIS
MediaStore.Images.Media.LONGITUDE, // <----- THIS
MediaStore.Images.Media.MIME_TYPE,
};
String selection = MediaStore.Files.FileColumns.MEDIA_TYPE + "="
+ MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE;
Uri queryUri = MediaStore.Files.getContentUri("external");
Cursor cursor = null;
MediaStore a ;
try {
cursor = context.getContentResolver().query(queryUri, projection, selection,
null, MediaStore.Images.Media.DATE_TAKEN + " DESC");
}
catch (NullPointerException ex){
}
Run Code Online (Sandbox Code Playgroud)
从Q开始,纬度和经度始终设置为0。如果ACCESS_MEDIA_LOCATION在清单中添加了权限,是否可以获取一批媒体的位置数据?
我正在尝试更新音频文件的流派标签。
码
final Uri genreUri = MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI;
String currentGenreName = MediaStore.Audio.Genres.NAME;
ContentValues values2 = new ContentValues();
values2.put(currentGenreName, genre);
String whereGenre = MediaStore.Audio.Genres._ID + "=?";
String[] whereVal2 = {Long.toString(genreID)};
resolver.update(genreUri, values2, whereGenre, whereVal2);
Run Code Online (Sandbox Code Playgroud)
我没有收到任何错误,但是MediaStore流派表中的流派没有更新。
其他标签(如标题,艺术家,专辑和艺术品)已更新,仅流派无效。
我也找不到有关更新音频文件中流派名称的任何信息,我只能通过上面的标签来做到这一点。
编辑
我用于编辑标题,艺术家,专辑名称和年份标签的代码,效果很好,所以我认为我必须对类型名称进行相同的操作,因为我具有类型ID。
final Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
ContentResolver resolver = c.getContentResolver();
String currentTitle = MediaStore.Audio.Media.TITLE;
String currentArtist = MediaStore.Audio.Media.ARTIST;
String currentAlbumID = MediaStore.Audio.Media.ALBUM_ID;
String currentAlbum = MediaStore.Audio.Media.ALBUM;
String currentGenreID = MediaStore.Audio.Genres._ID;
String currentGenreName = MediaStore.Audio.Genres.NAME;
String currentAlbumData = MediaStore.Audio.Media.DATA;
String currentYear …Run Code Online (Sandbox Code Playgroud) android ×10
mediastore ×4
albumart ×1
android-10.0 ×1
dialog ×1
java ×1
permissions ×1
readonly ×1
sql ×1
uri ×1