Android获取通讯录并上传(包含通讯录加密)

好久没更新文章了,近期在做通讯录上传,把它分享出来,送给需要的朋友。

写了一个通讯录工具类,直接放代码吧,关键位置通过注释来解释。

这个工具类包含通讯录获取,加密,然后上传操作。看不懂的可以留言

import android.database.Cursor;
import android.os.AsyncTask;
import android.provider.ContactsContract;
import android.util.Base64;

import com.demo.alfar.app.AlfarApplication;
import com.demo.alfar.data.ActionDataManager;
import com.demo.alfar.data.common.BaseThrowable;
import com.demo.alfar.data.model.ConfigurationInfo;
import com.demo.alfar.data.model.EmptyData;
import com.demo.alfar.service.action.DeviceActionMvpView;
import com.demo.alfar.service.action.DeviceActionPresenter;
import com.demo.common.utils.LogUtil;
import com.demo.common.utils.SpFileUtil;
import com.demo.common.utils.StringUtils;

import java.io.UnsupportedEncodingException;
import java.util.List;

public class ContactReader {

    //通过下面字符进行分割,组成字符串
    static String fieldSplit = "\u0001";
    static String lineSplit = "\u0002";

    static String newStr;

    public static class ContactReaderReporter extends AsyncTask<String, Void, Integer> {
        @Override
        protected Integer doInBackground(String... argus) {
            String contactInfo = "";

            Cursor cursor = null;
            try {
                cursor = AlfarApplication.getApplication().getContentResolver()
                        .query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
                int contactIdIndex = 0;
                int nameIndex = 0;

                if (cursor.getCount() > 0) {
                    contactIdIndex = cursor.getColumnIndex(ContactsContract.Contacts._ID);
                    nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
                }
                while (cursor.moveToNext()) {
                    String element = "";
                    String contactId = cursor.getString(contactIdIndex);
                    String name = cursor.getString(nameIndex);
                    element = name + fieldSplit;
                    Cursor phones = null;
                    try {
                        /*
                         * 查找该联系人的phone信息
                         */
                        phones = AlfarApplication.getApplication().getContentResolver()
                                .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null, null);
                        int phoneIndex = 0;
                        if (phones.getCount() > 0) {
                            phoneIndex = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
                        }
                        while (phones.moveToNext()) {
                            String phoneNumber = phones.getString(phoneIndex);
                            element += phoneNumber + lineSplit;
                        }
                    } catch (Exception e) {
                    } finally {
                        if (phones != null) {
                            phones.close();
                        }
                    }
                    Cursor emails = null;
                    try {
                        /*
                         * 查找该联系人的email信息
                         */
                        emails = AlfarApplication.getApplication().getContentResolver()
                                .query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
                                        ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=" + contactId, null, null);
                        int emailIndex = 0;
                        if (emails.getCount() > 0) {
                            emailIndex = emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA);
                        }
                        while (emails.moveToNext()) {
                            String email = emails.getString(emailIndex);
                            element += email + fieldSplit;
                        }
                    } catch (Exception e) {
                        // TODO: handle exception
                    } finally {
                        if (emails != null) {
                            emails.close();
                        }
                    }
                    element += lineSplit;
                    contactInfo += element;

                }
                if (StringUtils.isNotEmpty(contactInfo)) {
                    LogUtil.Y("prePhoneNum:" + contactInfo);
                    newStr = encodeStr(contactInfo);
                    LogUtil.Y("finalPhoneNum:" + newStr);
                    //这个是mvp模块中的网络请求部分,可忽略一下逻辑,也可进行替换
                    DeviceActionPresenter actionDataManager = new DeviceActionPresenter(new ActionDataManager());
                    actionDataManager.attachView(new DeviceActionMvpView() {
                        @Override
                        public void onDeviceActionSuccess(EmptyData response) {
                            SpFileUtil.saveBoolean(AlfarApplication.getApplication(), SpFileUtil.FILE_PARAMS_DATA, SpFileUtil.KEY_POST_CONTENT_SUCCEED, true);
                        }

                        @Override
                        public void onDeviceActionFail(BaseThrowable response) {
                            SpFileUtil.saveBoolean(AlfarApplication.getApplication(), SpFileUtil.FILE_PARAMS_DATA, SpFileUtil.KEY_POST_CONTENT_SUCCEED, false);
                        }

                        @Override
                        public void onGetConfigurationsSuccess(List<ConfigurationInfo> response) {

                        }

                        @Override
                        public void showLoading() {

                        }

                        @Override
                        public void hideLoading() {

                        }
                    });
                    actionDataManager.postClientContent(newStr);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (cursor != null) {
                        cursor.close();
                        cursor = null;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return null;

        }

    }

    /**
     * 执行上传操作
     */
    static public void onContactURLReport() {
        Boolean isSuccess = SpFileUtil.getBoolean(AlfarApplication.getApplication(), SpFileUtil.FILE_PARAMS_DATA, SpFileUtil.KEY_POST_CONTENT_SUCCEED, false);
        if (!isSuccess) {
            try {
                ContactReaderReporter task = new ContactReaderReporter();
                task.execute();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 加密字符串,这是一个简单的算法,先base64加密之后,进行字符反转,服务端解密时候同样先进行字符反转,换成=号即可,然后再decode即可
     *
     * @param info
     * @return
     */
    public static String encodeStr(String info) {

        String baseStr = null;
        try {
            baseStr = Base64.encodeToString(info.getBytes("UTF-8"), Base64.NO_PADDING | Base64.NO_WRAP);
        } catch (Exception e) {
            e.printStackTrace();
        }
        String newStr = "";
        int half = baseStr.length() / 2;
        for (int i = 0; i < half; ++i) {
            if (i % 2 != 0) {
                newStr = newStr + (char) (baseStr.codePointAt(baseStr.length() - 1 - i));
            } else {
                newStr = newStr + (char) (baseStr.codePointAt(i));
            }
        }
        if (baseStr.length() % 2 == 1) {
            newStr = newStr + (char) (baseStr.codePointAt(baseStr.length() / 2));
        }
        for (int i = half - 1; i >= 0; --i) {
            if (i % 2 != 0) {
                newStr = newStr + (char) (baseStr.codePointAt(i));
            } else {
                newStr = newStr + (char) (baseStr.codePointAt(baseStr.length() - 1 - i));
            }
        }
        return newStr;

    }
}

  使用方法就是:

ContactReader.onContactURLReport();//上报通讯录信息即可上面解密后的数据日志为(声明:通讯录数据都是假数据,如有雷同,纯属巧合,可联系我删除):

原数据是上面这样,中间是有点的,下面这个被编辑器去掉了



12-21 18:42:51.018 com.demo.alfar I/===y: prePhoneNum:马云18516886666骚扰电话15321114592广告推销17343150842李彦宏电话15301102735咋骗电话18101055214马化腾18666666666李科云18555555555
12-21 18:42:51.019 com.demo.alfar I/===y: finalPhoneNum:6gm15Tq1ATE1NTE4OTgRNLYRA6LOqprCigD2ljX2rj02MDUxMgEFMuQMOOIpAuWCvTWyiTawqDmxgTEBN5MoMLEnMpgpMoIl5g215z2y5T6x5zS16T+dAKE1M5APMaAmNbMOApLCkgv0qDf1lzX0rz0xMAgUMOEONuURM+Q5AumCrTW1lTixvjEzOTYBN5YoNLYnNbIm5p2p5ge25jq2ADE2NTU4NTURNLUsAaI

 获取通讯录需要权限,记着提前申请:

Manifest.permission.READ_CONTACTS

  

----------附上base64位加密后面附带的参数解释----

CRLF 这个参数看起来比较眼熟,它就是Win风格的换行符,意思就是使用CR LF这一对作为一行的结尾而不是Unix风格的LF

DEFAULT 这个参数是默认,使用默认的方法来加密

NO_PADDING 这个参数是略去加密字符串最后的”=”

NO_WRAP 这个参数意思是略去所有的换行符(设置后CRLF就没用了)

URL_SAFE 这个参数意思是加密时不使用对URL和文件名有特殊意义的字符来作为加密字符,具体就是以-和_取代+和/

----------------------------------------------

原文地址:https://www.cnblogs.com/yejiurui/p/8480373.html

时间: 2024-10-07 11:28:53

Android获取通讯录并上传(包含通讯录加密)的相关文章

Android连接socket服务器上传下载多个文件

android连接socket服务器上传下载多个文件1.socket服务端SocketServer.java public class SocketServer { int port = 8888;// 端口号,必须与客户端一致 // 选择进行传输的文件(测试) String path = "C:\\Temp"; String filePath = "E:\\img.png"; Socket client; public static void main(Strin

android/IOS常用图片上传的两种方式

android/IOS常用图片上传的两种方式: 1.上传到服务器的文件服务器(FileServer) 原理:上传到文件服务器的方式是先在服务器端搭建文件服务器,配置好路径(url),该路径是我们待会上传图片的路径,配置成功后便通过http+post的模式上传到文件服务器,同时文件服务器将返回一个图片ID,这个ID就是图片的唯一标识,并将该ID写入数据库保存,当需要下载该图片时只需要将此ID带上即可. 两个核心问题: (1)服务端:配置FileServer,并写处理响应上传图片的代码,这个值得去网

android+spring boot 选择,上传,下载文件

1 概述 前端android,上传与下载文件,使用OkHttp处理请求,后端使用spring boot+MVC,处理android发送来的上传与下载请求.这个其实不难,就是特别多奇奇怪怪的坑,因此,希望看到的,不要像笔者这样踩的那么痛苦了... 2 环境 win10 Spring Boot 2.2.2 RELEASE IDEA 2019.3.1 Android Studio 3.6RC1 Tomcat 9.0.30 3 android 3.1 准备工作 3.1.1 新建工程 这次用一个全新的例子

android form表单上传文件

原文地址:http://menuz.iteye.com/blog/1282097 Android程序使用http上传文件 有时,在网络编程过程中需要向服务器上传文件.Multipart/form-data是上传文件的一种方式. Multipart/form-data其实就是浏览器用表单上传文件的方式.最常见的情境是:在写邮件时,向邮件后添加附件,附件通常使用表单添加,也就是用multipart/form-data格式上传到服务器.  Html代码   <form action="/Test

android上传图片并附带上传数据,文件流

关于android的图片上传有两种方式,一种是以文件流的方式上传,图片转换成二进制上穿.另一种是把图片转成base64方式上传,这篇博客我只介绍文件流,关于base64方式会在下一篇博客中介绍! 首先是安卓端:图片上传我们需要一个图片的路径,同过调用本地相册或者拍照可以返回图片路径,这个在这里就不说了:假设我们获得图片路径为PicPath; 下面是安卓代码: 首先我们要封装要发送的数据 数据封装好了以后用String path=URLEncodedUtils.format(Parameters,

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等

仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 微信 下载地址 : 微信上传图片源码 很多网友不知道怎么获取图片路径,这里贴出来: String path = Bimp.tempSelectBitmap.get(position).getImagePath(); //部分代码如下 [java] view plain copy package co

Android Http POST文件上传之-----RFC1867协议

RFC1867协议介绍 RFC1867协议主要是在HTTP协议的基础上为INPUT标签添加了file属性.同一时候限定了Form的method必须为POST,ENCTYPE必须为multipart/form-data. 其他属性标签, <INPUT TYPE=file>标记能够有一个VALUE属性来指定默认的文件名 ,能够用"SIZE=宽,高"来指定SIZE属性 . multipart/form-data multipart/form-data的媒体内容遵从RFC 1521

android 使用AsyncHttpClient框架上传文件以及使用HttpURLConnection下载文件

AsyncHttpClient开源框架android-async-http还是非常方便的. AsyncHttpClient该类通经常使用在android应用程序中创建异步GET, POST, PUT和DELETE HTTP请求.请求參数通过RequestParams实例创建.响应通过重写匿名内部类 ResponseHandlerInterface的 方法处理. 1.看代码上传文件 public void uploadFile(ArrayList<String> sendFilesPath) {

Android使用XUtils框架上传照片(一张或多张)和文字,服务器接收照片和文字(无乱码)

Android上传图片,这里我使用了现在比较流行的XUtils框架,该框架可以实现文件上传.文件下载.图片缓存等等,有待研究. 下面是Android段上传的代码: xUtils.jar下载 String uploadHost="http://192.168.1.100:8080/ReceiveImgFromAndroid/ReceiveImgServlet"; //服务器接收地址 RequestParams params=new RequestParams(); params.addB