标签: android-contentresolver

如何实现只读的ContentProvider?

我想知道如何最好地实现只读的ContentProvider.我希望我的数据源只能通过我的ContentProvider的其他特殊方法(我当然无法通过ContentResolver访问)在我自己的应用程序中进行修改.换句话说,其他应用程序应该只能使用我的ContentProvider的查询方法,但不能使用插入,删除或更新.

显而易见的解决方案似乎是返回null/0/0并且在insert/delete/update中不执行任何操作.是不是总是在这些方法中抛出异常,以便清楚地表明不允许这些操作?或者是否有可能仅通过权限将对ContentProvider的访问限制为查询方法?

permissions android readonly android-contentresolver android-contentprovider

6
推荐指数
1
解决办法
2741
查看次数

Android:如何使用contentResolver仅更新多个记录中的一列

如何使用内容解析器更新多个记录的一个特定列?

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()方法,并使用要更改的列和值."

但是我无法做到这一点......我仍然不知道如何只更新所有记录的一列,基本上我需要将阅读的语音邮件标记为已读.

android android-contentresolver

6
推荐指数
0
解决办法
2675
查看次数

获取相册名称为Android的专辑封面

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

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

如何从联系人快捷菜单中为我的应用程序添加链接

我想编写与Contacts相关的应用程序.

场景:

  1. 输入电话联系人
  2. 我们选择联系项目

在此输入图像描述

  1. 单击MyApp(该图标仅适用于带号码的联系人)
  2. 查看联系号码,以便用户可以单击其中任何一个

  3. 我的应用程序将打开.

这是我到目前为止的地方:我在清单文件中添加了以下内容 -

            <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以便查看联系人电话号码或在其中放置自定义文本?

  • 使用新的MIMETYPE添加我自己的联系人对我来说不是一个选择......

android dialog android-manifest android-contentresolver android-contacts

6
推荐指数
1
解决办法
2884
查看次数

外部(例如脸书)联系人在android上的照片

我写了一个短信应用程序,在概述中显示了我的联系人的联系人照片.

获得"正常"照片是没有问题的:

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提供的联系人照片不存在,我怎样才能获得这些"外部"照片?

android android-contentresolver android-contacts

6
推荐指数
1
解决办法
358
查看次数

getcontentresolver()未定义类型

我尝试获取所有联系人姓名和号码,我正在尝试使用,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)

}

android android-contentresolver

6
推荐指数
1
解决办法
7017
查看次数

什么是MINI_THUMB_MAGIC以及如何使用它?

背景

我注意到MediaStore.Images.ImageColumns的一个奇怪的列叫做" MINI_THUMB_MAGIC ".

文档说的只是:

迷你拇指id.

类型:INTEGER

常数值:"mini_thumb_magic"

这个问题

我的猜测是这个字段与MediaStore.Images.Thumbnails有关.

这是对的吗 ?如果没有,这是什么以及如何使用它?

如果它是正确的,我还有其他相关的问题:

  1. 它是原始图像的迷你尺寸图像吗?它使用相同的宽高比还是对它进行中心裁剪?

  2. 为什么"MICRO"的大小是方形(96 x 96),"MINI"的大小是非方形矩形(512 x 384)?

  3. 你如何使用它?我的猜测是,它是通过使用"做THUMB_DATA ",这是一个blob,所以你使用它像这样,但是那又有什么用"的宗旨getThumbnail "如果你已经有了这个领域?

  4. 如果方向值不为0,它会获得旋转的缩略图吗?意思是如果我想展示它,我不需要旋转图像?

  5. 是否可以与缩略图一起查询图像?也许使用内连接?

  6. 它适用于所有Android设备和版本吗?

  7. 为什么它甚至被称为"魔术"?是因为它也适用于视频(由于某种原因,音乐不存在,例如,它可能是专辑的封面照片)?

sql android mediastore android-contentresolver android-gallery

6
推荐指数
1
解决办法
1401
查看次数

如何使用Glide Android加载带有"content://"前缀的URI?

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

6
推荐指数
1
解决办法
5248
查看次数

Android Q:通过MediaStore获取带有位置信息的图库

此处查看 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在清单中添加了权限,是否可以获取一批媒体的位置数据?

android mediastore android-contentresolver android-10.0

6
推荐指数
1
解决办法
2068
查看次数

如何更新媒体库中的流派?

我正在尝试更新音频文件的流派标签。

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)
  • genre:edittext(新流派名称)中的值。
  • genreID:所选音频文件中的genreID。

我没有收到任何错误,但是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)

java android uri mediastore android-contentresolver

6
推荐指数
0
解决办法
218
查看次数