如何从用户手机获取联系人 URI 并在 android 中使用 glide 加载

Posted

技术标签:

【中文标题】如何从用户手机获取联系人 URI 并在 android 中使用 glide 加载【英文标题】:How to get contact URI from user phone and load using glide in android 【发布时间】:2020-12-12 02:50:14 【问题描述】:

我的要求是我需要一直使用 glide 通过从用户手机中获取来加载联系人图像,到目前为止我已经取得的成果如下:

以下通过电话或电子邮件ID获取联系人URI的方法:

public static Uri getContactURI(Context context, String emailOrMobile) 
    Log.v(TAG, "displayContactPic: " + emailOrMobile);

    if (emailOrMobile == null) 
        Log.w(TAG, "emailOrMobile: " + emailOrMobile);
        return null;
    

    if (PermissionUtil.checkSelfPermission(context, Manifest.permission.READ_CONTACTS)
            != PackageManager.PERMISSION_GRANTED) 
        Log.w(TAG, "permission.READ_CONTACTS is not available! will skip");
        return null;
    

    Long contactId = null;
    if (emailOrMobile.contains("@")) 
        contactId = AppUtils.getContactIdByEmail(emailOrMobile, context);
     else 
        contactId = AppUtils.getContactIdByPhoneNums(emailOrMobile, context);
    

    Log.v(TAG, "contactId: " + contactId);

    if (contactId != 0) 
        return Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, "" + contactId);
     else 
        return null;
    

将 getContactURI(contactImgUri) 传递给下面的方法,以使用下面的滑行加载图片

Glide.with(context)
     .load(contactImgUri)
     .apply(RequestOptions.circleCropTransform())
     .listener(new RequestListener<Drawable>() 
         @Override
         public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) 
             //Log.d(TAG, " onLoadFailed Exception: " + e);
             return false;
         

         @Override
         public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, com.bumptech.glide.load.DataSource dataSource, boolean isFirstResource) 
             return false;
         

     )
     .into(imageView);

图像正在加载,但在 android studio log-cat 中我看到打印了太多日志,如下所示:

W/Glide:content://com.android.contacts/contacts/513 大小为 [88x88] 加载失败 com.bumptech.glide.load.engine.GlideException 类:加载资源失败 有3个原因: 滑翔:根本原因 (1 of 3) java.io.FileNotFoundException:对于 content://com.android.contacts/contacts/513,InputStream 为空

Glide:根本原因 (2 of 3) java.io.FileNotFoundException:此 URI 不支持流 I/O。; URI:content://com.android.contacts/contacts/513,调用用户:android.uid.shared:10041,调用包为:[com.android.providers.blockednumber,com.android.providers.userdictionary, com.android.providers.contacts,com.android.calllogbackup] 在 android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:149)

Glide:根本原因 (3 of 3) java.io.FileNotFoundException:此 URI 不支持流 I/O。; URI:content://com.android.contacts/contacts/513,调用用户:android.uid.shared:10041,调用包为:[com.android.providers.blockednumber,com.android.providers.userdictionary, com.android.providers.contacts,com.android.calllogbackup] 在 android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:149)

如果我有 1000 多个联系人,并且在 log-cat 中我可以看到太多这样的日志被打印出来,我正在寻找一种解决方案来避免上述日志或警告。

感谢任何帮助!

【问题讨论】:

【参考方案1】:
found below solution as below  
InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), contactImgUri);
            if (is == null) 
                Log.d(TAG,"contact pic not readable");
                // Your contact doesn't have a valid photo
                // i.e. use the default photo for your app
            
                
             else 
                Log.d(TAG,"contact pic readable");
                // This will always succeed when assigned to an ImageView!
                  photoUri = Uri.withAppendedPath(contactImgUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);

                Glide.with(context)
                        .load(photoUri)
                        .apply(RequestOptions.circleCropTransform())
                        .listener(new RequestListener<Drawable>() 
                            @Override
                            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) 
                                //Log.d(TAG, " onLoadFailed Exception: " + e);
                                return false;
                            

                            @Override
                            public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, com.bumptech.glide.load.DataSource dataSource, boolean isFirstResource) 
                               
                                return false;
                            

                        )
                        .placeholder(R.drawable.ic_person)
                        .error(R.drawable.ic_person)
                        .diskCacheStrategy(DiskCacheStrategy.ALL)
                        .skipMemoryCache(true)
                        .into(imageView);
            

【讨论】:

以上是关于如何从用户手机获取联系人 URI 并在 android 中使用 glide 加载的主要内容,如果未能解决你的问题,请参考以下文章

从 Android 中的 URI 检索联系人电话号码

从手机图库中获取随机图片并在视图中显示

如何从uri获取联系人ID?

如何从 android (CallLog.Calls.CONTENT_URI) 表中获取联系人姓名?

如何从列表视图中从 onItemClick() 获得的列表项的联系人 Uri 中检索数据?

无法从 ContactsContract.Contacts.CONTENT_URI 获取已删除的联系人