我尝试以下代码删除指定号码的联系人:
private void removeContact(Context context, String phone) {
//context.getContentResolver().delete(Contacts.Phones.CONTENT_URI, phone, null);
context.getContentResolver().delete(Contacts.Phones.CONTENT_URI,
Contacts.PhonesColumns.NUMBER+"=?", new String[] {phone});
}
Run Code Online (Sandbox Code Playgroud)
但是我得到了这个例外:
java.lang.UnsupportedOperationException: Cannot delete that URL: content://contacts/phones
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:130)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:110)
at android.content.ContentProviderProxy.delete(ContentProviderNative.java:362)
at android.content.ContentResolver.delete(ContentResolver.java:386)
Run Code Online (Sandbox Code Playgroud)
你能告诉我如何解决我的问题吗?
谢谢.
我在本教程中研究了如何使用ContentProviders和加载器
我是怎么看的:我们有一个Activity和ListView,SimpleCursorAdapter和CursorLoader.我们也实施ContentProvider.
在Activity我们可以调用getContentResolver().insert(URI, contentValues);通过点击一个按钮.
在我们的实现中ContentProvider,在insert()方法结束时,我们调用getContentResolver().notifyChange(URI, null);并且我们CursorLoader将收到消息,它应该重新加载数据并更新UI.此外,如果我们FLAG_REGISTER_CONTENT_OBSERVER在SimpleCursorAdapter其中使用它也将接收消息并且onContentChanged()将调用其方法.
因此,如果我们插入,更新或删除数据,我们的ListView将会更新.
Activity.startManagingCursor(cursor);已弃用,cursor.requery()已弃用,因此我没有看到任何练习意义 cursor.setNotificationUri().
我查看了setNotificationUri()方法的源代码,发现它调用mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver)了方法.也是CursorLoader一样的.最后,游标将接收消息,并在Cursor内部调用以下方法:
protected void onChange(boolean selfChange) {
synchronized (mSelfObserverLock) {
mContentObservable.dispatchChange(selfChange, null);
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
但我无法理解这一点.
所以我的问题是:我们为什么要叫cursor.setNotificationUri()在query()我们的方法ContentProvider实现?
database android cursor android-contentresolver android-contentprovider
我需要获取所有电话联系人及其电子邮件地址和照片uri:
这就是我在做什么:
private void getContacts() {
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(Contacts.CONTENT_URI, null, null, null, Contacts.DISPLAY_NAME);
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
// if
// (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))
// > 0) {
Contact contact = new Contact();
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
Uri uri = getContactPhotoUri(Long.parseLong(id));
// set photoUri
contact.setContactPhotoUri(uri);
// set name
contact.setContactName(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
// get the phone number
Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null);
while (pCur.moveToNext()) {
// …Run Code Online (Sandbox Code Playgroud) performance android android-contentresolver android-contentprovider android-contacts
我ContentProvider在互联网上观看了一个关于如何定义和使用a 的课程ContentProvider.
我对使用名为的方法感到困惑getContentResolver().这种方法有什么回报?
我ContentProvider没有实例,代码就是这样写的getContentProvider().query().
我不明白是怎么ContentProvider运作的.
我想在Android上执行以下查询(在伪代码中):
SELECT C.ID, C.NAME, CASE ISNULL(G.GROUPID,0) = 0 THEN 0 ELSE 1 END INGROUP
FROM CONTACTS C
LEFT JOIN GROUPMEMBERSHIP G ON G.CONTACTID = C.ID AND G.GROUPID = ?
Run Code Online (Sandbox Code Playgroud)
我希望通过默认的Contacts ContentProvider选择系统通讯录中所有联系人的ID和名称,以及指示联系人是否是组成员的0/1字段?.
我当然可以很容易地获得所有联系人,然后在我的Adapter类中循环遍历并分别查询成员资格,但我想要执行两个查询,因为一个外部联接查询会产生更好的性能.
我可以使用标准的高级字符串投影和ContentResolver.query()方法吗?或者这种查询是否需要深入研究更直接的SQL执行?
sql android left-join android-contentresolver android-contacts
我想获取WhatsApp个人资料图片和编号,但使用contentResolver我将使用以下代码段获取名称和编号.
private void showContactWhatsApp(){
ContentResolver cr = getContentResolver();
Cursor contactCursor = cr.query(
ContactsContract.RawContacts.CONTENT_URI,
new String[]{ContactsContract.RawContacts._ID,
ContactsContract.RawContacts.CONTACT_ID},
ContactsContract.RawContacts.ACCOUNT_TYPE + "= ?",
new String[]{"com.whatsapp"},
null);
ArrayList<String> myWhatsappContacts = new ArrayList<>();
if (contactCursor != null) {
if (contactCursor.getCount() > 0) {
if (contactCursor.moveToFirst()) {
do {
//whatsappContactId for get Number,Name,Id ect... from ContactsContract.CommonDataKinds.Phone
String whatsappContactId = contactCursor.getString(contactCursor.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID));
if (whatsappContactId != null) {
//Get Data from ContactsContract.CommonDataKinds.Phone of Specific CONTACT_ID
Cursor whatsAppContactCursor = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME},
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", …Run Code Online (Sandbox Code Playgroud) 我正在尝试插入视频MediaStore,就像使用此方法存储图像一样:
MediaStore.Images.Media.insertImage(getContentResolver(), imagePath, null, null)
Run Code Online (Sandbox Code Playgroud)
由于没有类似的方法MediaStore.Video.Media,我尝试做的是插入一条记录MediaStore.Video.Media.EXTERNAL_CONTENT_URI,然后将文件复制到目的地,如下所示:
ContentValues values = new ContentValues();
values.put(MediaStore.Video.Media.TITLE, "Title1");
values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
values.put(MediaStore.Video.Media.DATA, videoPath);
Uri uri = cr.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
try {
OutputStream os = cr.openOutputStream(uri);
...
...
} (FileNotFoundException e) {
cr.delete(uri, null, null);
}
Run Code Online (Sandbox Code Playgroud)
在uri返回的non-null的形式content://media/external/video/media/{id},这似乎是正确的.
但是当cr.openOutputStream(uri);被激活时,会FileNotFoundException被抛出.
最后一点类似于Image.Media.insertImage查看其源代码所做的操作.
顺便说一句,我确实得到了WRITE_EXTERNAL_STORAGE许可.另外,我正在测试4.3和4.4.
我试图通过电话获得whatsapp联系,我得到whatsapp联系的总数,但是从RawContacts如何获得whatsapp我不知道的号码和名称.我试图找到解决方案,但无法得到确切的解决方案.请帮我.
我把我的代码放在下面.
ContentResolver cr = context.getContentResolver();
Cursor c = cr.query(
ContactsContract.RawContacts.CONTENT_URI,
new String[] { ContactsContract.RawContacts.CONTACT_ID, ContactsContract.RawContacts.DISPLAY_NAME_PRIMARY },
ContactsContract.RawContacts.ACCOUNT_TYPE + "= ?",
new String[] { "com.whatsapp" },
null);
ArrayList<String> myWhatsappContacts = new ArrayList<>();
String projection[] = { ContactsContract.CommonDataKinds.Phone.NUMBER };
if(c != null) {
if (c.getCount() > 0) {
while (c.moveToNext()) {
String whatsappContactId = c.getString(c.getColumnIndex(ContactsContract.RawContacts.Data._ID));
Cursor dataCursor = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
projection,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
new String[]{whatsappContactId}, null);
// You can also read RawContacts.CONTACT_ID to read the
// …Run Code Online (Sandbox Code Playgroud) android contacts android-contentresolver android-contacts whatsapp
我见过的所有例子registerContentObserver()都是通过ContentProvider界面实现的.但Cursor有一个registerContentObserver()调用,所以我想也许Android人们已经把一些深刻的魔法放在一起,SQLite当活动结果集中的一行改变时,它允许在游标上获得更新.我做错了,或者没有这样的魔法.这是我正在使用的代码,期望是当我点击按钮更新第1行中的值时,我会得到一个onChange()回调.有任何想法吗?
public class MainActivity extends Activity {
private static final String DATABASE_NAME = "test.db";
public static final String TAG = "dbtest";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button make = (Button)findViewById(R.id.btn_make_record);
make.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
MyOpenHelper oh = new MyOpenHelper(v.getContext());
SQLiteDatabase wdb = oh.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("value", String.valueOf(System.currentTimeMillis()));
if (wdb.insert(MyOpenHelper.TABLE_NAME, null, cv) …Run Code Online (Sandbox Code Playgroud) 我创建了两个内容提供程序,它们在同一个SQLite数据库的两个不同的表上工作.它们共享的单个实例SQLiteOpenHelper作为阿里Serghini的职位描述.每个内容提供商的注册AndroidManifest.xml如下.
<provider
android:name=".contentprovider.PostsContentProvider"
android:authorities="com.example.myapp.provider"
android:exported="false"
android:multiprocess="true" >
</provider>
<provider
android:name=".contentprovider.CommentsContentProvider"
android:authorities="com.example.myapp.provider"
android:exported="false"
android:multiprocess="true" >
</provider>
Run Code Online (Sandbox Code Playgroud)
每个内容提供商定义所需的内容URI并提供UriMatcher.
public class PostsProvider extends BaseContentProvider {
private static final UriMatcher sUriMatcher = buildUriMatcher();
private static final int POSTS = 100;
private static final int POST_ID = 101;
private static UriMatcher buildUriMatcher() {
final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
final String authority = CustomContract.CONTENT_AUTHORITY;
matcher.addURI(authority, DatabaseProperties.TABLE_NAME_POSTS, POSTS);
matcher.addURI(authority, DatabaseProperties.TABLE_NAME_POSTS + "/#", POST_ID);
return matcher;
}
Run Code Online (Sandbox Code Playgroud)
...
public …Run Code Online (Sandbox Code Playgroud)