2017-02-09 19:15:23 via_myra 阅读数 757
  • Android 开发 第三方SDK 百度定位SDK

    百度地图Android定位SDK是为Android移动端应用提供的一套简单易用的LBS定位服务接口,专注于为广大开发者提供好的综合定位服务,通过使用百度定位SDK,开发者可以轻松为应用程序实现智能、、高效的定位功能。 主要内容包括简介 密钥申请 环境配置、定位SDK使用,获取当前位置信息 等知识

    4854 人正在学习 去看看 Frank Lee

Android ContentProvider 之查看/读取手机联系人

看到某些App里面有读取联系人的功能,然后自己尝试了一下。发现这个挺简单的。然后自己就做了一个demo给大家,希望借这个demo可以让大家学习一下怎么实现读取手机联系人。

这里我用了两种方法去读取:第一张图片是跳转到系统自带的联系人界面,第二种就是直接去读取让后绑上来显示在主页面。话不多说直接上代码。

记得在AndroidManifest.xml 记得加入这两句,不然就读取不到联系人。

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
package com.example.android_contentersolver;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Contacts;
import android.provider.ContactsContract;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.main_btn).setOnClickListener(new OnClickListener() {  
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //查询联系人号码
                final Cursor cursor = getContentResolver()
                        .query(ContactsContract.CommonDataKinds
                        .Phone.CONTENT_URI, null, null, null, null);

                 BaseAdapter adapter = new BaseAdapter()
                 {
                     @Override
                     public int getCount()
                     {
                         return cursor.getCount();
                     }

                     @Override
                     public Object getItem(int position)
                     {
                         return position;
                     }

                     @Override
                     public long getItemId(int position)
                     {
                         return position;
                     }

                     @Override
                     public View getView(int position,
                             View convertView, ViewGroup parent)
                         {
                             cursor.moveToPosition(position);
//                             CheckBox rb = new CheckBox(MainActivity.this);
                             TextView text=new TextView(MainActivity.this);
                             // 获取联系人的电话号码,并去掉中间的中划线、空格
                             String number = cursor
                                 .getString(cursor.getColumnIndex(
                                 ContactsContract.CommonDataKinds
                                 .Phone.NUMBER))
                                 .replace("-", "")
                                 .replace(" ", "");
//                             rb.setText(number);
                             String name = cursor
                                     .getString(cursor.getColumnIndex(
                                     ContactsContract.CommonDataKinds
                                     .Phone.DISPLAY_NAME));
                                text.setText("名字:"+name+"   电话号码:"+number);


                             return text;
                         }
                 };

              //加载listview
              ListView listview=(ListView) findViewById(R.id.mian_list);
              listview.setAdapter(adapter);
            }
        });


        //跳转系统的联系人界面
        findViewById(R.id.main_btn_sys).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent=new Intent();
                intent.setAction(intent.ACTION_PICK);
                intent.setType("vnd.android.cursor.dir/phone");
                startActivityForResult(intent, 0x100);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
        Uri uri=data.getData();
        Cursor cursor = getContentResolver()
                .query(uri, null, null, null, null);
        while(cursor.moveToNext()){
            String name=cursor.getString(cursor.getColumnIndexOrThrow(Contacts.Phones.NAME));
            String number=cursor.getString(cursor.getColumnIndexOrThrow(Contacts.Phones.NUMBER));
            TextView textview=(TextView) findViewById(R.id.mian_lists);
            textview.setText("名字:"+name+"   电话号码:"+number);
        }
    }



}

这是主界面

这里写图片描述

这里写图片描述

这里写图片描述

2013-07-26 18:36:55 iteye_1356 阅读数 97
  • Android 开发 第三方SDK 百度定位SDK

    百度地图Android定位SDK是为Android移动端应用提供的一套简单易用的LBS定位服务接口,专注于为广大开发者提供好的综合定位服务,通过使用百度定位SDK,开发者可以轻松为应用程序实现智能、、高效的定位功能。 主要内容包括简介 密钥申请 环境配置、定位SDK使用,获取当前位置信息 等知识

    4854 人正在学习 去看看 Frank Lee
在我们的每日短信程序中,有一个这样的功能,就是点击‘选择联系人’按钮,会出现联系人选择界面,点击选择联系人后,会将这个联系人的手机号码加入一个文本框中。

关于选择联系人,可以直接使用Android的内置联系人实现,网上也有些例子,但是有些代码有点问题,有的在模拟器正常,手机上不行,有的手机OK,模拟器不行。原因是在联系人URI使用了硬编码,你可以使用ContactsContract.Contacts.CONTENT_URI常量来增强移植性。
选择联系人部分代码如下:
Java代码
mChooseContactButton.setOnClickListener(new Button.OnClickListener(){

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);

SMSSendActivity.this.startActivityForResult(intent, 1);
}

});

接下来就是获取选择联系人的手机号码,首先需要通过函数onActivityResult获取选择的联系人,然后通过Content Provider查询联系人的手机号码,代码片段如下:
Java代码
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode)
{

case (1) :
{

if (resultCode == Activity.RESULT_OK)
{

Uri contactData = data.getData();

Cursor c = managedQuery(contactData, null, null, null, null);

c.moveToFirst();

String phoneNum=this.getContactPhone(c);
mPhoneNum.setText(phoneNum); //mPhoneNum为接收的EditText或TextView

}

break;

}
}
}


//获取联系人电话
private String getContactPhone(Cursor cursor)
{

int phoneColumn = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
int phoneNum = cursor.getInt(phoneColumn);
String phoneResult="";
//System.out.print(phoneNum);
if (phoneNum > 0)
{
// 获得联系人的ID号
int idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
String contactId = cursor.getString(idColumn);
// 获得联系人的电话号码的cursor;
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID+ " = " + contactId,
null, null);
//int phoneCount = phones.getCount();
//allPhoneNum = new ArrayList<String>(phoneCount);
if (phones.moveToFirst())
{
// 遍历所有的电话号码
for (;!phones.isAfterLast();phones.moveToNext())
{
int index = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
int typeindex = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
int phone_type = phones.getInt(typeindex);
String phoneNumber = phones.getString(index);

// 获取联系人姓名代码改为: String phoneName=phones.getString(phones.getColumnIndex(PhoneLookup.DISPLAY_NAME));


switch(phone_type)
{
case 2:
phoneResult=phoneNumber;
break;
}
//allPhoneNum.add(phoneNumber);
}
if (!phones.isClosed())
{
phones.close();
}
}
}
return phoneResult;
}

这样,就可以实现通过选择联系人来获取它的手机号码了。

注意:最后要在AndroidManifest中配置读取联系人的权限,<uses-permission android:name="android.permission.READ_CONTACTS"/>。
2019-07-06 11:39:22 weixin_43344890 阅读数 253
  • Android 开发 第三方SDK 百度定位SDK

    百度地图Android定位SDK是为Android移动端应用提供的一套简单易用的LBS定位服务接口,专注于为广大开发者提供好的综合定位服务,通过使用百度定位SDK,开发者可以轻松为应用程序实现智能、、高效的定位功能。 主要内容包括简介 密钥申请 环境配置、定位SDK使用,获取当前位置信息 等知识

    4854 人正在学习 去看看 Frank Lee

因为读取联系人信息属于危险权限,所以此程序我用到了Android的动态申请权限,如果你对动态申请权限还不了解,请看我的另一篇博客,链接地址如下

Android动态申请权限

现在我们来分析一下怎么使用Android的内容提供器读取手机联系人信息,首先你要知道联系人信息在哪?怎么读取?

其实我们的联系人信息都保存在Android内置数据库的一张表上,我们只要读取对应的那张数据表上的信息就可以了,读取步骤如下:

  1. 调用getContentResolver().query()方法得到一个Cursor对象
  2. 将Cursor对象定位在第一行
  3. 对Cursor对象进行读取操作,对数据表以行的方式进行读取
  4. 将Cursor对象移到下一行
  5. 关闭Cursor对象

别忘了在AndroidManifest.xml文件中声明权限,在AndroidManifest.xml加入以下代码:

<uses-permission android:name="android.permission.READ_CONTACTS"/>

好了,现在正式开始程序,MainActivity的代码如下:

public class MainActivity extends AppCompatActivity {
    private ListView mListView;
    private ArrayAdapter<String> adapter;
    private List<String> list = new ArrayList<>();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 实例化ListView
        mListView = findViewById(R.id.main_list);
        // 实例化ArrayAdapter
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
        // 为ListView设置适配器
        mListView.setAdapter(adapter);

        // 判断有没有联系人读取权限,如果没有,就动态申请,有的话,就直接读取联系人
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
            // 动态申请联系人权限,此处的请求码是1
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 1);
        } else {
            // 读取联系人信息
            readContacts();
        }

    }

    // 读取联系人信息
    private void readContacts() {
        // 创建一个光标对象
        Cursor cursor = null;

        try {
            // 使用内容提供器得到一个光标对象
            cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);

            while (cursor.moveToNext()) {
                // 读取联系人姓名
                String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                // 读取联系人手机号码
                String Number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                //将读取的联系人姓名和手机号码添加到list列表中
                list.add(displayName + "\n" + Number);
            }
            // 更新ListView显示的数据
            adapter.notifyDataSetChanged();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }

    }

    // 动态申请权限的回调
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        // 通过请求码来判断需要申请的权限是否授权
        switch (requestCode) {
            case 1:
                // 如果权限已经授权就调用readContacts()方法读取联系人,否则就提示一个Toast
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    readContacts();
                } else {
                    Toast.makeText(this, "没有读取联系人权限", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
        }

    }

}

程序解析:
以上程序我是直接通过一个ListView来显示读取联系人信息,首先定义并初始化一个ListView组件,然后为ListView设置适配器,在判断是否获取了读取联系人信息的权限,如果没有,就动态申请,如果有,就直接调用已经写好的readContacts()方法进行读取,最后,在动态申请权限的回调方法中写上对应的逻辑操作。

2011-09-19 13:02:52 book_ruanfongyi 阅读数 133
  • Android 开发 第三方SDK 百度定位SDK

    百度地图Android定位SDK是为Android移动端应用提供的一套简单易用的LBS定位服务接口,专注于为广大开发者提供好的综合定位服务,通过使用百度定位SDK,开发者可以轻松为应用程序实现智能、、高效的定位功能。 主要内容包括简介 密钥申请 环境配置、定位SDK使用,获取当前位置信息 等知识

    4854 人正在学习 去看看 Frank Lee
在我开发的每日短信程序中,有一个这样的功能,就是点击‘选择联系人’按钮,会出现联系人选择界面,点击选择联系人后,会将这个联系人的手机号码加入一个文本框中。关于这个程序介绍和界面可以参看:[url=http://renzhen.iteye.com/blog/1173238]我的第一个Android程序 [/url]
关于选择联系人,可以直接使用Android的内置联系人实现,网上也有些例子,但是有些代码有点问题,有的在模拟器正常,手机上不行,有的手机OK,模拟器不行。原因是在联系人URI使用了硬编码,你可以使用ContactsContract.Contacts.CONTENT_URI常量来增强移植性。
选择联系人部分代码如下:

mChooseContactButton.setOnClickListener(new Button.OnClickListener(){

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);

SMSSendActivity.this.startActivityForResult(intent, 1);
}

});

接下来就是获取选择联系人的手机号码,首先需要通过函数onActivityResult获取选择的联系人,然后通过Content Provider查询联系人的手机号码,代码片段如下:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode)
{

case (1) :
{

if (resultCode == Activity.RESULT_OK)
{

Uri contactData = data.getData();

Cursor c = managedQuery(contactData, null, null, null, null);

c.moveToFirst();

String phoneNum=this.getContactPhone(c);
mPhoneNum.setText(phoneNum);

}

break;

}

}




}


//获取联系人电话
private String getContactPhone(Cursor cursor)
{

int phoneColumn = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
int phoneNum = cursor.getInt(phoneColumn);
String phoneResult="";
//System.out.print(phoneNum);
if (phoneNum > 0)
{
// 获得联系人的ID号
int idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
String contactId = cursor.getString(idColumn);
// 获得联系人的电话号码的cursor;
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID+ " = " + contactId,
null, null);
//int phoneCount = phones.getCount();
//allPhoneNum = new ArrayList<String>(phoneCount);
if (phones.moveToFirst())
{
// 遍历所有的电话号码
for (;!phones.isAfterLast();phones.moveToNext())
{
int index = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
int typeindex = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
int phone_type = phones.getInt(typeindex);
String phoneNumber = phones.getString(index);
switch(phone_type)
{
case 2:
phoneResult=phoneNumber;
break;
}
//allPhoneNum.add(phoneNumber);
}
if (!phones.isClosed())
{
phones.close();
}
}
}
return phoneResult;
}

这样,就可以实现通过选择联系人来获取它的手机号码了,代码是我从我程序代码直接拷贝的,需要做部分修改,但是绝对可用。 :arrow:
2010-12-14 19:52:00 xjanker2 阅读数 10910
  • Android 开发 第三方SDK 百度定位SDK

    百度地图Android定位SDK是为Android移动端应用提供的一套简单易用的LBS定位服务接口,专注于为广大开发者提供好的综合定位服务,通过使用百度定位SDK,开发者可以轻松为应用程序实现智能、、高效的定位功能。 主要内容包括简介 密钥申请 环境配置、定位SDK使用,获取当前位置信息 等知识

    4854 人正在学习 去看看 Frank Lee

本文来自http://blog.csdn.net/xjanker2 ,引用转载必须注明出处!

上一篇中使用了打电话发短信的功能,但号码联系人信息我们还不知道。本篇开始讲如何从Android中得到本机联系人的信息。

由于Android较快的版本升级,部分API已经发生了变化。本篇探究的通过ContentProvider机制获取联系人的API从Android2.0开始做了很大调整,原来的android.provider.Contacts类及其下相关类由android.provider.ContactsContract代替。原类体系标记为Deprecated(废弃),因为兼容的原因目前还存在,但不保证以后的更新版本中完全丢弃。

 

所以本文先从Android2.1以上平台的联系人读取开始说起,下面给出代码在Android2.1/2.2中运行的效果图,

 

 

首先,创建类ViewContacts继承ListActivity,并设为为应用的开始Activity。

ViewContacts.java 代码:

 

 

 main.xml 代码:

list_item.xml 代码:

 

AndroidManifest.xml 增加uses权限READ_CONTACTS 代码:

 

以上文件编写好后,应用就能够在Android2.1模拟器上正确运行了。

 

那么该app如果在android1.6上运行,会怎么样呢?1.6上并没有ContactsContract类体系,所以就会报错了。需要注意,ContactContract类是在API Level 5增加的,之前的Android版本并不支持。

在Android 1.6 (API Level 4)上,获取联系人的方法将fillMaps()实现为如下:

 

 

 那么就能在1.6上运行了,效果截图如下:

联系人API,在Android2.0后产生变化,如果使用如上1.6版本的调用,你会发现在2.1下姓名有了,但电话号码不显示了。仔细观察可以发现,People.CONTENT_URI等调用在2.0以上的sdk中都标记了Deprecated。这一点,对于编写希望能够同时兼容1.6与2.x版本的应用造成了困难。那么,如果应用涉及到联系人的读取,非得要编写多个版本的apk了吗? 其实,我们可以使用判断当前系统API Level的方法编写两套代码备用,这个就留给大家去实践了。

 

获得系统API level方法:

内置Content Provider

阅读数 278

没有更多推荐了,返回首页