Android - 检索联系人照片并显示

2023-11-24

我正在创建一个简单的应用程序,用于检索每个联系人的姓名和电话号码,并在列表视图中显示,并在行开头的缩略图大小的图像视图中显示联系人的照片。

我已成功检索并显示姓名和号码,但在浏览了许多教程和堆栈后未能显示照片。

我最终将其恢复为仅显示姓名和号码。

任何人都可以帮忙提供联系照片吗?我在下面提供了我的代码。

提前致谢!

---联系 getter 和 setter --- 此方法正确获取姓名和号码,但我不确定我是否正确获取照片。

 package content;

 import android.net.Uri;


 public class ContactBean {
private String name;
private String phoneNo;
private Uri proPic;

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getPhoneNo() {
    return phoneNo;
}
public void setPhoneNo(String phoneNo) {
    this.phoneNo = phoneNo;
}

public Uri getPhotoUri() {
    return this.proPic;
}

public void setPhotoUri(Uri photoUri) {
    this.proPic = proPic;
}

}

---备份列表活动---

package backUpContacts;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import backUpContacts.BackUpListActivity;

import com.example.contactflipper.R;

import content.ContactBean;


 import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentUris;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
 import android.provider.ContactsContract;
import android.view.View;
import android.widget.AdapterView;
 import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class BackUpListActivity extends Activity implements
OnItemClickListener {

private ListView listView;
private List<ContactBean> list = new ArrayList<ContactBean>();
private String contactID;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.save_backups);

    listView = (ListView) findViewById(R.id.list);
    listView.setOnItemClickListener(this);
    String image_uri = "";
    Bitmap bitmap = null;

    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));


        ContactBean objContact = new ContactBean();
        objContact.setName(name);
        objContact.setPhoneNo(phoneNumber);
        list.add(objContact);

    }
    phones.close();

    BackUpListAdapter objAdapter = new BackUpListAdapter(
            BackUpListActivity.this, R.layout.save_list_row, list);
    listView.setAdapter(objAdapter);

    if (null != list && list.size() != 0) {
        Collections.sort(list, new Comparator<ContactBean>() {

            @Override
            public int compare(ContactBean lhs, ContactBean rhs) {
                return lhs.getName().compareTo(rhs.getName());
            }
        });
        AlertDialog alert = new AlertDialog.Builder(
                BackUpListActivity.this).create();
        alert.setTitle("");

        alert.setMessage(list.size() + " Contact Found!!!");

        alert.setButton("OK", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        alert.show();

    } else {
        showToast("No Contact Found!!!");
    }
}

private void showToast(String msg) {
    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}


@Override
public void onItemClick(AdapterView<?> listview, View v, int position,
        long id) {
    ContactBean bean = (ContactBean) listview.getItemAtPosition(position);
    //implement something on the click of each listed item - bean
}

}

---备份列表适配器---

package backUpContacts;

import java.util.ArrayList;
import java.util.List;

import viewContacts.GridAdapter.ViewHolder;

import com.example.contactflipper.R;

 import content.ContactBean;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
 import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;

public class BackUpListAdapter extends ArrayAdapter<ContactBean> implements  OnClickListener{

private Activity activity;
private List<ContactBean> items;
private ArrayList<Boolean> itemChecked = new ArrayList<Boolean>();
private int row;
private ContactBean objBean;

public BackUpListAdapter(Activity act, int row, List<ContactBean> items) {
    super(act, row, items);

    this.activity = act;
    this.row = row;
    this.items = items;

    for (int i = 0; i < this.getCount(); i++) {
        itemChecked.add(i, false); // initializes all items value with false
    }

}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View view = convertView;
    ViewHolder holder;
    if (view == null) {
        LayoutInflater inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(row, null);

        holder = new ViewHolder();
        view.setTag(holder);


    } else {
        holder = (ViewHolder) view.getTag();
    }

    if ((items == null) || ((position + 1) > items.size()))
        return view;

    objBean = items.get(position);

    holder.tvname = (TextView) view.findViewById(R.id.tvname);
    holder.tvPhoneNo = (TextView) view.findViewById(R.id.tvphone);
    holder.ivPic = (ImageView) view.findViewById(R.id.profile_pic);

    if (holder.tvname != null && null != objBean.getName()
            && objBean.getName().trim().length() > 0) {
        holder.tvname.setText(Html.fromHtml(objBean.getName()));
    }
    if (holder.tvPhoneNo != null && null != objBean.getPhoneNo()
            && objBean.getPhoneNo().trim().length() > 0) {
        holder.tvPhoneNo.setText(Html.fromHtml(objBean.getPhoneNo()));
    }


    final CheckBox cBox = (CheckBox) view.findViewById(R.id.chkMarkContact); // your
    // CheckBox
    cBox.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {

            CheckBox cb = (CheckBox) v.findViewById(R.id.chkMarkContact);

            if (cb.isChecked()) {
                itemChecked.set(position, true);
                // do some operations here
            } else if (!cb.isChecked()) {
                itemChecked.set(position, false);
                // do some operations here
            }
        }
    });
    cBox.setChecked(itemChecked.get(position)); // this will Check or Uncheck the
    // CheckBox in ListView
    // according to their original
    // position and CheckBox never
    // loss his State when you
    // Scroll the List Items.



    return view;
}

public class ViewHolder {
    public TextView tvname, tvPhoneNo;
    public ImageView ivPic;
}

@Override
public void onClick(View arg0) {
    // TODO Auto-generated method stub

}

}

在上面的代码中我相信我需要类似的东西

if (holder.tvPhoneNo != null && null != objBean.getPhoneNo()
            && objBean.getPhoneNo().trim().length() > 0) {
        holder.tvPhoneNo.setText(Html.fromHtml(objBean.getPhoneNo()));
    }

除了要显示的照片。

我还已经在 xml 中创建了一个 imageview 并在上面的代码中声明了它

  holder.ivPic = (ImageView) view.findViewById(R.id.profile_pic);

您尝试获取联系人的联系人 ID(电话号码)并使用 Bitmapfactory 来解码图像,如下面的工作代码所示。

InputStream inputStream=null;
String[] projection = new String[]{Contacts._ID};
Uri contactUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,Uri.encode(phnumber));
Cursor c = getContentResolver().query(contactUri, projection,
    null, null, null);
if (c.moveToFirst()) {
    long contactId=c.getColumnIndex(Contacts._ID);

    inputStream = Contacts.openContactPhotoInputStream(activity.getContentResolver(),
                            ContentUris.withAppendedId(Contacts.CONTENT_URI, cntID));
    c.close();

}

使用输入流获取位图

Bitmap bitmap= BitmapFactory.decodeStream(inputStream);
 holder.ivPic.setImageBitmap(bitmap);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android - 检索联系人照片并显示 的相关文章

随机推荐

  • 苹果应用内购买

    在设备上的沙盒环境中测试应用内购买时 我记录了以下错误 错误域 SKErrorDomain代码 0 无法连接到iTunes Store UserInfo 0x2916a0 NSLocalizedDescription 无法连接到iTunes
  • 如何使用 Webpack 导出函数并在 HTML 页面中使用它?

    我有一个名为index js use strict var require jquery window jQuery export function foo console log hello world 并且在同一个目录下 webpack
  • 如何摆脱Django Form的RadioSelect生成的虚假选择

    我在 Django 1 3 上使用 ModelForm 模型 py class UserProfile models Model gender models CharField max length 1 blank True choices
  • 如何对数据集进行排序?

    我有包含表项目的数据集 如何按代码字段对该表进行排序 提前致谢 With DataTable 你通常会排序一个DataView 例如 DataTable table dataSet Tables foo DataView view tabl
  • 突出显示文本,html 标签除外

    我使用下面的代码突出显示文本中的一些关键字 message str ireplace words span class hightlighted text words span message 文本可能包含一些html标签 例如 img s
  • 我可以将 MSVCRT 与 mingw 静态链接吗?

    我有编译用的 C 程序mingw在 Windows 上 它工作正常但需要MSVCRT DLL 我想静态链接它 就像我在 Visual Studio 中可以做的那样 这可能吗 I tried static标记为gcc它没有做出任何改变 也使用
  • Android - AlertDialog 样式

    我的应用程序中有一个警报对话框 如下所示 我希望标题和分隔标题 消息正文的线为橙色 我怎样才能做到这一点 我尝试的是使用自定义样式 如下所示 但这没有用 我的警报对话框代码 AlertDialog Builder alertDialog n
  • pymc3:具有多个观察变量的分层模型

    我有一个简单的分层模型 其中有很多个体 我有来自正态分布的小样本 这些分布的均值也遵循正态分布 import numpy as np n individuals 200 points per individual 10 means np r
  • 将 bytea 转换为二进制字符串

    我需要解码一个 Base64 字符串并获取一块二进制文件 Postgres中是否有一个SQL函数可以简单地转换bytea转换为二进制字符串表示形式 Like 00010001010101010 如果您的 Postgres 安装使用默认设置运
  • 如何选择具有给定类名的第一个、第二个或第三个元素?

    如何在元素列表中选择某个元素 我有以下内容 div class myclass my text1 div div p stuff p div div p more stuff p div p span Hello World span p
  • PHP GD如何在一条线上绘制文本

    The final output should be like image HELLO WORLD 这就是我正在做的 im imagecreate 400 400 txtcol imagecolorallocate im 0xFF 0x00
  • Android 打开外部存储目录(sdcard)用于存储文件

    我想打开外部存储目录路径以编程方式保存文件 我尝试过但没有获取 SD 卡路径 我该怎么办 有什么解决办法吗 private File path new File Environment getExternalStoragePublicDir
  • 延长课程是一个好的做法吗?

    我的数据库类中有一个 PDO 连接 最近我一直使用它作为其他类的扩展 即class Users extends Database这使我能够始终保持数据库连接 而无需在我的 Users 类中拥有函数 然而 有人指出我不应该这样做 因为这是一种
  • 分号有什么作用?

    我在网上找到了一个函数来帮助我完成当前的项目 并且它的某些行上有分号 我想知道为什么 是为了破坏功能吗 def containsAny self strings alphabet abcdefghijklmnopqrstuvwxyz0123
  • JQuery/JQuery UI 水平分隔线

    最近 我正在开发一个网站 我想创建一个水平分隔线 能够使用 jquery 调整页面上两个元素的大小 基本上 Content 您还可以查看UI Layout jQuery 插件 这是一个demo
  • 如何在链接的 npm 依赖项(开发中)和已安装的依赖项(暂存/生产中)之间切换?

    我正在开发一个自定义 npm 模块 并且它有一个 GitHub 存储库 我还在开发一个使用自定义模块的项目 当处理较大的项目时 使用它是很好的npm link这样我就可以对模块进行更改并立即在主项目中看到它们 To deploy to st
  • 在flutter中,如何将facebook受众作为中介网络与Admob集成?

    我是广告中介新手 我有一个 flutter 应用程序 并且使用以下 admob flutter 插件集成了 admob 并且它在 Android 和 iOS 上运行良好 https pub dev packages admob flutte
  • 暴雪官方魔兽世界 API 在哪里?

    我想知道是否可以通过 API 访问 魔兽世界 我的要求非常明确 必须是暴雪官方API 必须可以在游戏外访问 暴雪现已发布社区 API 允许您直接从暴雪服务获取信息 例如领域状态 玩家和拍卖数据 https dev battle net io
  • 使用构建参数构建 Docker 映像并将其从 DevOps 推送到 ACR

    我正在 Azure DevOps 管道中构建 Docker 映像 然后我想将其推送到 Azure 容器注册表 注册表已创建 并且我已配置 DevOps 来使用它 还有buildAndPushDocker任务 works 然而 由于 Dock
  • Android - 检索联系人照片并显示

    我正在创建一个简单的应用程序 用于检索每个联系人的姓名和电话号码 并在列表视图中显示 并在行开头的缩略图大小的图像视图中显示联系人的照片 我已成功检索并显示姓名和号码 但在浏览了许多教程和堆栈后未能显示照片 我最终将其恢复为仅显示姓名和号码