这是一个很神奇的问题.我理解对ContentResolver方法的调用需要一个特定于ContentProvider的URI,但android如何实际建立关联?
我猜测任何与AndroidManifest.xml中的ContentProvider提供的权限相匹配的URI都会涉及到.请求是否发送到包含该权限的每个提供商?如果我尝试创建其权限前缀为另一个权限的提供程序将是一个问题?
有没有办法看看ContentProvider是否正在运行?我想也许getType()方法的虚拟响应可能表示活跃.
我正在使用“MediaStore.Images.Media.EXTERNAL_CONTENT_URI”来查询存储在 SD 卡上的照片。现在我只想要在某个特定日期之后添加的照片。我正在使用“contentResolver.query()”方法进行查询,但我不明白如何按 Date_ADDED 或 DATE_MODIFIED 进行过滤。这可以做到吗?
感谢帮助!
我有时会在某些设备上遇到RuntimeException,如果我尝试查询的话CallLog.Calls.我查询CallLog.Callswith contentProvider以获得最后一次通话.
任何人都可以帮忙,为什么我有时会收到这个错误?我想,这是一个系统错误/问题?
Caused by: android.database.sqlite.SQLiteException: no such column: sdn_alpha_id: ,
while compiling: SELECT sns_receiver_count, numberlabel, service_type, matched_number,
type, contactid, lookup_uri, mime_type, sdn_alpha_id, sp_type, messageid, fname,
imnum, lname, sns_pkey, account_id, formatted_number, call_out_duration, number,
geocoded_location, account_name, is_read, raw_contact_id, source_data, cdnip_number,
state, _subject, date, real_phone_number, source_package, _id, sns_tid, name,
normalized_number, name_reversed, _data, photo_id, logtype, reject_flag, has_content,
m_content, country_code, frequent, cityid, bname, countryiso, numbertype, new,
duration, cnap_name, address, e164_number, voicemail_uri FROM logs WHERE
(logs.logtype=100 OR logs.logtype=110 OR logs.logtype=500 …Run Code Online (Sandbox Code Playgroud) 我在MediaStore中获得了图片ID.如何在ID中查看图库中的图像?我目前使用以下代码:
ContentResolver cr = context.getContentResolver();
String columns[] = new String[]{
Media._ID, Media.DATA
};
Cursor cursor = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, Media._ID+"=?", new String[]{id+""}, null);
if(cursor.moveToNext()) {
String imagePath = cursor.getString(cursor.getColumnIndex(Media.DATA));
Uri imageUri = Uri.fromFile(new File(imagePath));
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.addCategory(android.content.Intent.CATEGORY_DEFAULT);
intent.setDataAndType(imageUri, "image/*");
((Activity)context).startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)
它有效,但它太麻烦了.我认为应该有一种更简单的方法来做到这一点.关键是从图像ID获取图像Uri.
我找到了一些删除数据库并使用 ContentProvider 重新创建它的解决方案。
ContentResolver resolver = mContext.getContentResolver();
ContentProviderClient client = resolver.acquireContentProviderClient(KOOPSContentProvider.AUTHORITY);
assert client != null;
KOOPSContentProvider provider = (KOOPSContentProvider) client.getLocalContentProvider();
assert provider != null;
provider.resetDatabase();
client.release();
Run Code Online (Sandbox Code Playgroud)
但在ContentProviderClient类已经release()被弃用,是否有任何其他的方式来释放资源。
编辑:如果我尝试使用close(),它显示如下警告。
This ContentProviderClient should be freed up after use with #release().许多资源,例如 TypedArrays、VelocityTrackers 等,在使用后应该回收(通过 recycle() 调用)。此 lint 检查查找丢失的 recycle() 调用。
和close()显示为禁用,为什么?
android android-contentresolver android-contentprovider contentproviderclient
我正在使用带有 的游标加载器,RecyclerView其他一切正常,除了每次从 RecyclerView 中删除一个项目时,最后一个项目闪烁,就像这样
我的删除代码是
public void deleteData(long id){
Uri uri = ContentUris.withAppendedId(URI, id);
getContentResolver().delete(uri, null, null);
}
Run Code Online (Sandbox Code Playgroud)
刷卡代码:
deleteData(viewHolder.getItemId());
Run Code Online (Sandbox Code Playgroud)
请注意,我有一个使用相同的另一个活动RecyclerAdapter,ContentProvider甚至大多数的实现和方法途径和布局代码,都是一样的,但一个完美的作品没有任何闪烁,所以这对我来说是很奇怪的情况。
是否有可能导致此问题的特定原因?我已经尝试禁用动画
recyclerView.getItemAnimator().setChangeDuration(0);
Run Code Online (Sandbox Code Playgroud)
或者
((DefaultItemAnimator) recyclerViewObject.getItemAnimator()).setSupportsChangeAnimations(false);
Run Code Online (Sandbox Code Playgroud)
但这些都没有奏效,更不用说我确实希望动画正常工作。
编辑:断点上传:
在创建:
"main@4668" prio=5 tid=0x2 nid=NA runnable java.lang.Thread.State: RUNNABLE at com.jackz314.todo.HistoryActivity.onCreateLoader(HistoryActivity.java:803) at android.support.v4.app。 LoaderManagerImpl.createLoader(LoaderManager.java:539) at android.support.v4.app.LoaderManagerImpl.createAndInstallLoader(LoaderManager.java:548) at android.support.v4.app.LoaderManagerImpl.initLoader(LoaderManager.java:603) at com .jackz314.todo.HistoryActivity.displayAllNotes(HistoryActivity.java:394) 在 com.jackz314.todo.HistoryActivity.deleteExpiredNotes(HistoryActivity.java:767) 在 com.jackz314.todo.HistoryActivity.onCreate(HistoryActivity.java:129)
在 android.app.Activity.performCreate(Activity.java:6975) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770) 在 android.app。 ActivityThread.handleLaunchActivity(ActivityThread.java:2892) at android.app.ActivityThread.-wrap11(ActivityThread.java:-1) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
在 android.os.Handler.dispatchMessage(Handler.java:105) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6541) 在 …
android android-contentresolver android-contentprovider android-cursorloader android-recyclerview
getCropAndSetWallpaperIntent()在android中使用时出现此错误
D/Exception: java.lang.IllegalArgumentException: Cannot use passed URI to set wallpaper; check that the type returned by ContentProvider matches image/*
Run Code Online (Sandbox Code Playgroud)
但是当我检查Content使用类型时,ContentResolver我得到了
D/CONTENT TYPE:: IS: image/jpeg
那么为什么Wallpaper Manager给我内容错误?
这是我用来获取图像 URI 的代码
public Uri getImageUri(Context inContext, Bitmap inImage) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
tempPath = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
Log.d("URI OF SET IMAGE", tempPath);
ContentResolver cr = this.getContentResolver();
Log.d("CONTENT TYPE: ", "IS: " + cr.getType(Uri.parse(tempPath)));
return Uri.parse(tempPath);
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗 ?
android android-contentresolver android-contentprovider android-wallpaper
我试图从具有特定 MIME 类型的目录中获取所有文件 - 我想要所有图像。
我使用了一些示例代码,其中使用 MediaStore 作为 URI,但后来发现很难为所选目录过滤它,因为结果集中返回的 URI 的格式与我提供的 URI 的格式不同...
所以我找到了这个示例代码https://github.com/googlesamples/android-DirectorySelection
它查询所选子树上的 DocumentContract,现在需要过滤所需的 MIME 类型。
问题是:无论我提供什么作为选择参数,它总是会列出该目录中找到的所有文件/目录。
我什至尝试“1=2”作为选择,这仍然列出了所有内容。任何想法我做错了什么?
val ChildrenUri = DocumentsContract.buildChildDocumentsUriUsingTree( uri, DocumentsContract.getTreeDocumentId(uri) )
val childCursor = contentResolver.query(
childrenUri,
arrayOf(DocumentsContract.Document.COLUMN_DISPLAY_NAME, COLUMN_MIME_TYPE),
"$COLUMN_MIME_TYPE=?",
Array(1){MimeTypeMap.getSingleton().getExtensionFromMimeType("jpg")},
null
)
Log.i("ADDFOLDER", "files: ${childCursor.count}")
try {
while (childCursor.moveToNext()) {
Log.d(
TAG, "found child=" + childCursor.getString(0) + ", mime=" + childCursor
.getString(1)
)
}
} finally {
closeQuietly(childCursor)
}
Run Code Online (Sandbox Code Playgroud) 我正在升级一些旧版本以针对 Android Q,当然此代码停止工作:
String[] PROJECTION_BUCKET = {MediaStore.Images.ImageColumns.BUCKET_ID,
MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
MediaStore.Images.ImageColumns.DATE_TAKEN,
MediaStore.Images.ImageColumns.DATA,
"COUNT(" + MediaStore.Images.ImageColumns._ID + ") AS COUNT",
MediaStore.Files.FileColumns.MEDIA_TYPE,
MediaStore.MediaColumns._ID};
String BUCKET_GROUP_BY = " 1) and " + BUCKET_WHERE.toString() + " GROUP BY 1,(2";
cur = context.getContentResolver().query(images, PROJECTION_BUCKET,
BUCKET_GROUP_BY, null, BUCKET_ORDER_BY);
Run Code Online (Sandbox Code Playgroud)
android.database.sqlite.SQLiteException:“GROUP”附近:语法错误(代码 1 SQLITE_ERROR[1])
这里它应该获取包含相册名称、日期、图片数量的图像列表 - 每个相册一张图像,因此我们可以创建相册选择器屏幕,而无需查询所有图片并循环遍历它以创建相册。
由于 SQL 查询停止工作,是否可以使用 contentResolver 对查询结果进行分组?
(我知道 ImageColumns.DATA 和“COUNT() AS COUNT”也被弃用,但这是一个关于 GROUP BY 的问题)
(有一种方法可以查询相册并单独查询照片,以获得相册封面的照片uri,但我想避免开销)
mediastore android-contentresolver android-sqlite android-10.0
我的应用程序的 targetSdkVersion = 29(新的范围存储策略)并且没有在清单中启用 requestlegacyexternalstorage 标志(我不想启用它)。
我尝试编写意图的方法:
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);
Run Code Online (Sandbox Code Playgroud)
也试过这个
val galleryIntent = Intent(Intent.ACTION_PICK).apply {
type = PICK_INTENT_TYPE
}
flowInterruptBlocker?.blockFlowInterruption()
startActivityForResult(galleryIntent, GALLERY_INTENT_REQUEST_CODE)
Run Code Online (Sandbox Code Playgroud)
还试图添加一个CATEGORY_OPENABLE意图。这些都不起作用。
因此,当我发送意图从图库中选择图像时,游戏市场中的一些应用程序会返回一个带有文件方案的 Uri,例如:file:///storage/emulated/0/Download/sample.jpg
当我尝试将其转换为位图(用于设置为 imageView)时,我收到 EACCES(权限被拒绝)异常。
我试着用以下方式阅读它:
java.File Api
contentResolver.openInpuStream()
contentResolver.openFileDescriptor()
ImageDecoder
Run Code Online (Sandbox Code Playgroud)
没有任何帮助。正如我所看到的,如果我的清单中没有启用 requestlegacyexternalstorage 标志,我将无法在 android 10(针对 29 sdk)上使用文件方案读取 Uri。
如果我错了,请帮助我弄清楚如何阅读它。
关于它的神秘事情,带有针对 29 sdk 的应用程序的 android 11 模拟器可以在没有 requestlegacyexternalstorage 标志的情况下读取这些类型的 Uri。
是的,我已授予 READ/WRITE_EXTERNAL_STORAGE 权限。
android android-contentresolver kotlin android-external-storage android-10.0