您可以通过URI删除内容解析程序,也可以将一些参数传递给where参数.
如何使参数成为SQL注入安全?
是否可以将准备好的语句与ContentResolver一起使用?
act.getContentResolver().delete(myuriwithid,null,null);
act.getContentResolver().delete(mybaseuri," name = '"+this.name"'",null);
Run Code Online (Sandbox Code Playgroud) android sql-injection android-contentresolver android-sdk-2.1
我正在尝试通过显示名称找到联系人.目标是打开此联系人并向其添加更多数据(特别是更多的电话号码),但我很难找到我想要更新的联系人.
这是我正在使用的代码:
public static String findContact(Context context) {
ContentResolver contentResolver = context.getContentResolver();
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI;
String[] projection = new String[] { PhoneLookup._ID };
String selection = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " = ?";
String[] selectionArguments = { "John Johnson" };
Cursor cursor = contentResolver.query(uri, projection, selection, selectionArguments, null);
if (cursor != null) {
while (cursor.moveToNext()) {
return cursor.getString(0);
}
}
return "John Johnson not found";
}
Run Code Online (Sandbox Code Playgroud)
我确实有一个名为"John Johnson"的联系人,但该方法始终返回"未找到".我也尝试用一个名字搜索一个联系人,这没什么区别.
我怀疑它的东西,错误的URI,选择或选择论,因为我无法找到搜索与给定的显示名称接触的任何例子在线,似乎显示名称是一种特殊的信息,例如从不同一个电话号码.
任何想法如何找到约翰逊?
更新:我发现了如何通过显示名称找到联系人:
ContentResolver contentResolver = context.getContentResolver();
Uri uri = Data.CONTENT_URI;
String[] projection …Run Code Online (Sandbox Code Playgroud) 我已经浏览了许多在Android中使用SQLite的示例/教程.比方说,你有使用SQLite,一个应用程序ContentProvider,CursorLoader一个自定义CursorAdapter.现在我发现的所有主要示例都依赖于a CursorLoader来获取数据CursorAdapter,这本质上CursorLoader是以Async-UI线程安全的方式发生的.然而,这些相同的例子都使插入/删除/更新通过调用ContentResolver在主线程(例如,从onClick,onResume,onPause).(示例)它们不会将这些调用包装在一个AsyncTask或启动一个单独的线程中或使用AsyncQueryHandler.为什么这样,如此多的写得好的博客/例子怎么会犯这么明显的错误呢?或者是简单的单行插入/删除/更新调用如此之快,以至于它们足以安全地从Main/UI线程启动?这些快速通话的正确方法是什么?
背景
我正在阅读Android内容提供商的本教程.我从本教程中了解到,
为了让其他应用程序访问Content Provider的数据,提供者应用程序必须指定客户端应用程序访问其提供者数据所需的权限.
客户端应用程序使用该<uses-permission>元素在其清单文件中指定所需的权限,例如
<uses-permission android:name="android.permission.READ_USER_DICTIONARY" > <!-- In the client app's manifest -->
Run Code Online (Sandbox Code Playgroud)
然后,当用户安装客户端应用程序时,APK管理员会询问用户是否同意这些权限(在客户端应用程序中).
题
我的问题是,提供商(app)如何指定必须授予其他客户端应用程序的权限才能访问提供商的数据?
从开发者指南,
要查找您正在使用的提供程序的读访问权限的确切名称,以及提供程序使用的其他访问权限的名称,请查看提供程序的文档.
那么在提供者应用程序中指定这些权限的方式是什么 - 在提供者的文档中?如果是这样,那文档在哪里找到了?我在哪里可以找到SearchableDictionary提供程序的文档(在教程中用作示例),如果我在我的应用程序中编写Content Provider,我应该在哪里提供该文档?
permissions android android-manifest android-contentresolver android-contentprovider
我正在构建一个严重依赖用户联系人的应用程序.
我已经创建了一个Account并RawContacts在需要时代表此帐户创建.
我使用SyncAdapter,事情很棒.
但我仍然错过了这个难题的一些部分:
我正在尝试实现类似于WhatsApp的行为.这样 -
当任何联系人的姓名或电话发生变化时 - 它将被发送到服务器进行评估.
这个联系人是否已经在"我的"中RawContacts,他是否刚刚由用户创建.
我知道有ContentObserver但是跟踪ContactsContract.Contacts.CONTENT_URI似乎是错误的事情,因为它没有给出具体的改变,加上它被提升到很多次,并且从许多不感兴趣的事件.
我知道WhatsApp正在使用SyncAdapter,但我认为他们可能会做更多的事情.
任何想法将不胜感激.
android android-contentresolver android-contentprovider android-syncadapter
随着更新的Android Q的出现,许多事情发生了变化,尤其是在范围存储和file:///URI 逐渐弃用的情况下。问题是缺少有关如何在Android Q设备上正确处理媒体文件的文档。
我有一个媒体文件(音频)管理应用程序,但找不到一种可靠的方法来告诉OS我对文件进行了更改,以便它可以更新其MediaStore记录。
选项1:MediaScannerService
MediaScannerConnection.scanFile(context, new String[]{ filePath }, new String[]{"audio/*"}, new MediaScannerConnection.OnScanCompletedListener() {
@Override
public void onScanCompleted(String s, Uri uri) {
}
});
Run Code Online (Sandbox Code Playgroud)
file://主存储中的URIfile://辅助存储(例如可移动存储)中的URIcontent://URI选项2:广播
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
Run Code Online (Sandbox Code Playgroud)
选项3:手动插入MediaStore
AudioFileContentValues是来自的某些列值MediaStore.Audio.AudioColumns。
基于file://URI的旧方法:
Uri uri = MediaStore.Audio.Media.getContentUriForPath(file_path);
newUri = context.getContentResolver().insert(uri, AudioFileContentValues);
Run Code Online (Sandbox Code Playgroud)
MediaStore.Audio.Media.getContentUriForPath 不推荐使用基于我可以从文档中得出的新方法:
Uri collection = MediaStore.Audio.Media.getContentUri(correctVolume);
newUri = context.getContentResolver().insert(collection, AudioFileContentValues);
Run Code Online (Sandbox Code Playgroud)
哪里correctVolume会external从主存储,同时它会是这样的0000-0000二级存储,根据该文件的位置。 …
android mediastore android-contentresolver android-external-storage android-10.0
我正在尝试开发一个仅使用同步帐户同步的应用程序ContentResolver.requestSync(account, authority, extras);.
我可以使用和分别作为同步来同步联系人和日历.com.android.contactscom.android.calendarauthority
但是,有没有办法获得特定帐户支持的权限列表?
另外,使用的效果null是authority什么?
对于一个设备上得到所有图片我查询ContentResolver了MediaStore.Images.现在我想添加一个选项来显示隐藏文件,以及像QuickPic这样的许多图像应用程序.
有没有比递归搜索手机上的所有目录更快的方法,并检查是否有.nomedia文件,如果是,请检查我是否可以在其中找到一些图像文件?
通过它是不可能的ContentResolver吗?
目前,我在我的应用程序中显示手机的所有联系人作为自定义回收站视图.到目前为止,我在列表项视图中显示联系人的姓名,手机号码和个人资料图片,但我需要获取该联系人的所有信息,并在自定义详细信息页面中单击我的应用程序的列表项时显示该信息.
对于每个联系人,可以使用不同的信息集,例如我收到的电子邮件很少,但很少有联系人不存在.
我的问题是
如何获取给定联系人的所有信息而不会错过任何一个位.是否有一个结构可以遍历并检查每个键的值?
此外,当我在我的应用列表中填充系统联系人时,我在列表中多次找到相同的联系人.我认为这是因为在我的设备的帐户管理器中,许多帐户都注册了相同的号码,例如whatsapp,gmail.如果是这样,如何在我的列表中只显示该号码一次.
android android-contentresolver contactscontract android-contentprovider
java.lang.IllegalArgumentException:未知的 URL 内容://media/external/images/media 位于 android.content.ContentResolver.insert(ContentResolver.java:1837)
与某些设备。其中有故障的设备是 Redmi 9A
ContentResolver contentResolver = context.getContentResolver();
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.TITLE, fileName);
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName);
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, getMimeType(context, Uri.parse(pathFile)));
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);
contentValues.put(MediaStore.MediaColumns.IS_PENDING, Cursor.FIELD_TYPE_INTEGER);
// add datetime
long now = System.currentTimeMillis() / 1000;
contentValues.put(MediaStore.MediaColumns.DATE_ADDED, now);
contentValues.put(MediaStore.MediaColumns.DATE_MODIFIED, now);
contentValues.put(MediaStore.MediaColumns.DATE_TAKEN, now);
//Media image.
Uri uriTarget = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
Run Code Online (Sandbox Code Playgroud) android ×10
mediastore ×2
accounts ×1
android-10.0 ×1
permissions ×1
sql-insert ×1
sqlite ×1
sync ×1
ui-thread ×1