Android之抓取短信,所有应用信息,通讯录,通话记录,手机系统相册图片

这篇具有很好参考价值的文章主要介绍了Android之抓取短信,所有应用信息,通讯录,通话记录,手机系统相册图片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

一般我们做金融APP会遇到风控需求,需要获取用户手机短信,手机所有安装应用信息,通讯录,通话记录等功能,接下来我们看看怎么做,一篇文章解决所有!


一、抓取这些玩意需要的权限

1.kotlin

            //6.0才用动态权限
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (activity?.let {
                        ContextCompat.checkSelfPermission(
                            it,
                            Manifest.permission.READ_SMS
                        )
                    }
                    != PackageManager.PERMISSION_GRANTED
                ) {
                    // 申请读写内存卡内容和拍照 获取短信,获取通话记录,获取通讯录权限
                    activity?.let {
                        ActivityCompat.requestPermissions(
                            it, arrayOf(
                                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                Manifest.permission.CAMERA,
                                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                Manifest.permission.READ_SMS,
                                Manifest.permission.READ_CALL_LOG,
                                Manifest.permission.READ_CONTACTS
                            ), 1
                        )
                    }
                } else {
                    startActivity(Intent(activity, UotyActivity::class.java))
                }
            }

2.Java

    //6.0才用动态权限
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_SMS)
                        != PackageManager.PERMISSION_GRANTED) {
                    // 申请读写内存卡内容和拍照 获取短信,获取通话记录,获取通讯录权限
                    ActivityCompat.requestPermissions(getActivity(),
                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA,
                                    Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_SMS, Manifest.permission.READ_CALL_LOG, Manifest.permission.READ_CONTACTS}, 1);
                } else {
                    startActivity(new Intent(getActivity(), UotyActivity.class));
                }
            }

二、获取手机短信

1.kotlin

    /**
     * 获取通短信
     */
    @SuppressLint("Range")
    private fun getSMS() {
        val uri = Uri.parse("content://sms/")
        val projection = arrayOf("_id", "address", "person", "body", "date", "type")
        val cursor = contentResolver.query(uri, projection, null, null, "date desc")
        if (cursor != null && cursor.moveToFirst()) {
            do {
                val bean = SMSBean()
                val id = cursor.getString(cursor.getColumnIndex("_id")) //id
                val address = cursor.getString(cursor.getColumnIndex("address")) //电话
                val person = cursor.getString(cursor.getColumnIndex("person")) //姓名
                val body = cursor.getString(cursor.getColumnIndex("body")) //内容
                val date = cursor.getString(cursor.getColumnIndex("date")) //时间戳
                val type = cursor.getString(cursor.getColumnIndex("type")) //类型1为收短信,2为发短信
                var name: String = getContactNameFromNumber(address) + ""
                var phoneNumber: String = getContactPhoneNumberFromNumber(address) + ""
                if (name == "" || name == "null") {
                    name = address
                }
                if (phoneNumber == "" || phoneNumber == "null") {
                    phoneNumber = name
                }
                println("获取短信信息:id: $id, name: $name,phone:$phoneNumber, person: $person, body: $body, date: $date, type: $type")
                bean.id = id
                bean.name = name
                bean.person = person
                bean.body = body
                bean.date = date
                bean.phone = phoneNumber
                bean.type = type
                //这里的smsBeanList是一个MutableList<SMSBean>可变集合
                smsBeanList.add(bean)
            } while (cursor.moveToNext())
        }
        cursor?.close()
        //这里JSON字符串是给后台的
        json = Gson().toJson(smsBeanList)
        println("获取短信信息json:$json")
    }

2.Java

/**
     * 获取通短信
     */
    @SuppressLint("Range")
    private void getSMS() {
        Uri uri = Uri.parse("content://sms/");
        String[] projection = new String[]{"_id", "address", "person", "body", "date", "type"};
        Cursor cursor = getContentResolver().query(uri, projection, null, null, "date desc");
        if (cursor != null && cursor.moveToFirst()) {
            do {
                SMSBean bean = new SMSBean();
                String id = cursor.getString(cursor.getColumnIndex("_id"));//id
                String address = cursor.getString(cursor.getColumnIndex("address"));//电话
                String person = cursor.getString(cursor.getColumnIndex("person"));//姓名
                String body = cursor.getString(cursor.getColumnIndex("body"));//内容
                String date = cursor.getString(cursor.getColumnIndex("date"));//时间戳
                String type = cursor.getString(cursor.getColumnIndex("type"));//类型1为收短信,2为发短信
                String name = getContactNameFromNumber(address) + "";
                String phoneNumber = getContactPhoneNumberFromNumber(address) + "";
                if (name.equals("") || name.equals("null")) {
                    name = address;
                }
                if (phoneNumber.equals("") || phoneNumber.equals("null")) {
                    phoneNumber = name;
                }
                System.out.println("获取短信信息:" + "id: " + id + ", name: " + name + ",phone:" + phoneNumber + ", person: " + person + ", body: " + body + ", date: " + date + ", type: " + type);
                bean.setId(id);
                bean.setName(name);
                bean.setPerson(person);
                bean.setBody(body);
                bean.setDate(date);
                bean.setPhone(phoneNumber);
                bean.setType(type);
                //这里的smsBeanList是一个List<SMSBean>集合
                smsBeanList.add(bean);
            } while (cursor.moveToNext());
        }
        if (cursor != null) {
            cursor.close();
        }
        //这里JSON字符串是给后台的
        json = new Gson().toJson(smsBeanList);
        System.out.println("获取短信信息json:" + json);

三、获取手机所有应用信息

1.kotlin

 // 获取已安装的应用信息队列
    @SuppressLint("WrongConstant")
    fun getAppInfo(ctx: Context, type: Int): MutableList<AppInfo> {
        val appList: ArrayList<AppInfo> = ArrayList<AppInfo>()
        val siArray = SparseIntArray()
        // 获得应用包管理器
        val pm = ctx.packageManager
        // 获取系统中已经安装的应用列表
        val installList = pm.getInstalledApplications(
            PackageManager.PERMISSION_GRANTED
        )
        for (i in installList.indices) {
            val item = installList[i]
            // 去掉重复的应用信息
            if (siArray.indexOfKey(item.uid) >= 0) {
                continue
            }
            // 往siArray中添加一个应用编号,以便后续的去重校验
            siArray.put(item.uid, 1)
            try {
                // 获取该应用的权限列表
                val permissions = pm.getPackageInfo(
                    item.packageName, PackageManager.GET_PERMISSIONS
                ).requestedPermissions ?: continue
                var isQueryNetwork = false
                for (permission in permissions) {
                    // 过滤那些具备上网权限的应用
                    if (permission == "android.permission.INTERNET") {
                        isQueryNetwork = true
                        break
                    }
                }
                // 类型为0表示所有应用,为1表示只要联网应用
                if (type == 0 || type == 1 && isQueryNetwork) {
                    try {
                        val packageInfo = pm.getPackageInfo(packageName, 0)
                        //应用装时间
                        firstInstallTime = packageInfo.firstInstallTime.toString() + ""
                        //应用最后一次更新时间
                        val lastUpdateTime = packageInfo.lastUpdateTime
                    } catch (e: PackageManager.NameNotFoundException) {
                        e.printStackTrace()
                    }
                    val app = AppInfo()
                    app.setUid(item.uid.toString() + "") // 获取应用的编号
                    app.setPackagename(item.packageName)
                    app.setName(item.loadLabel(pm).toString())
                    app.setTime(firstInstallTime)
                    appList.add(app)
                }
            } catch (e: java.lang.Exception) {
                e.printStackTrace()
                continue
            }
        }
        return appList // 返回去重后的应用包队列
    }

//这里得到JSON字符串appInfoList是可变集合MutableList<AppInfo>
 appInfoList = getAppInfo(this@UotyActivity, 0)
 json = Gson().toJson(appInfoList)

2.Java

 // 获取已安装的应用信息队列
    public ArrayList<AppInfo> getAppInfo(Context ctx, int type) {
        ArrayList<AppInfo> appList = new ArrayList<AppInfo>();
        SparseIntArray siArray = new SparseIntArray();
        // 获得应用包管理器
        PackageManager pm = ctx.getPackageManager();
        // 获取系统中已经安装的应用列表
        @SuppressLint("WrongConstant")
        List<ApplicationInfo> installList = pm.getInstalledApplications(
                PackageManager.PERMISSION_GRANTED);
        for (int i = 0; i < installList.size(); i++) {
            ApplicationInfo item = installList.get(i);
            // 去掉重复的应用信息
            if (siArray.indexOfKey(item.uid) >= 0) {
                continue;
            }
            // 往siArray中添加一个应用编号,以便后续的去重校验
            siArray.put(item.uid, 1);
            try {
                // 获取该应用的权限列表
                String[] permissions = pm.getPackageInfo(item.packageName,
                        PackageManager.GET_PERMISSIONS).requestedPermissions;
                if (permissions == null) {
                    continue;
                }
                boolean isQueryNetwork = false;
                for (String permission : permissions) {
                    // 过滤那些具备上网权限的应用
                    if (permission.equals("android.permission.INTERNET")) {
                        isQueryNetwork = true;
                        break;
                    }
                }
                // 类型为0表示所有应用,为1表示只要联网应用
                if (type == 0 || (type == 1 && isQueryNetwork)) {
                    try {
                        PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
                        //应用装时间
                        firstInstallTime = packageInfo.firstInstallTime + "";
                        //应用最后一次更新时间
                        long lastUpdateTime = packageInfo.lastUpdateTime;

                    } catch (PackageManager.NameNotFoundException e) {
                        e.printStackTrace();
                    }
                    AppInfo app = new AppInfo();
                    app.setUid(item.uid + ""); // 获取应用的编号
                    app.setPackagename(item.packageName);
                    app.setName(item.loadLabel(pm).toString());
                    app.setTime(firstInstallTime);
                    appList.add(app);
                }
            } catch (Exception e) {
                e.printStackTrace();
                continue;
            }
        }
        return appList;  // 返回去重后的应用包队列
    }
//这里得到JSON字符串appInfoList是集合List<AppInfo>
 appInfoList = getAppInfo(UotyActivity.this, 0);
 json = new Gson().toJson(appInfoList);

三、获取通讯录

1.获取通讯录工具类

/**
 * @Author : CaoLiulang
 * @Time : 2023/7/10 09:13
 * @Description :获取联系人工具类
 */
public class ContactUtils {
    private final Context context;
    private List<MessageBean> contactData;

    public ContactUtils(Context context) {
        this.context = context;
    }

    //获取联系人所有信息(这里返回String,你也可以直接返回其他类型改改就可以了)
    @SuppressLint("Range")
    public List<MessageBean> getInformation() throws JSONException {
        contactData = new ArrayList<>();
        int num = 0;
        // 获得所有的联系人
        Cursor cur = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
        // 循环遍历
        if (cur.moveToFirst()) {
            int idColumn = cur.getColumnIndex(ContactsContract.Contacts._ID);
            int displayNameColumn = cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
            do {
                MessageBean messageBean = new MessageBean();

                num++;
                // 获得联系人的ID号
                String contactId = cur.getString(idColumn);
                // 获得联系人姓名
                String disPlayName = cur.getString(displayNameColumn);
                // 查看该联系人有多少个电话号码。如果没有这返回值为0
                int phoneCount = cur.getInt(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
                messageBean.setDisplayName(disPlayName);
                messageBean.setId(contactId);
                if (phoneCount > 0) {
                    // 获得联系人的电话号码
                    Cursor phones = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
                    if (phones.moveToFirst()) {
                        do {

                            String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                            messageBean.setPhoneNumber(phoneNumber);

                        } while (phones.moveToNext());
                    }
                    // 获取该联系人邮箱
                    Cursor emails = context.getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
                    if (emails.moveToFirst()) {
                        do {
                            String emailValue = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                            messageBean.setEmail(emailValue);

                        } while (emails.moveToNext());
                    }
                    contactData.add(messageBean);
                }
            } while (cur.moveToNext());
        }
        Log.e("联系人信息=====", contactData.toString());
        return contactData;
    }

}

2.MessageBean

这里我只需要这些字段,需要更多自己添加

public class MessageBean {
    private String id;
    private String phoneNumber;
    private String displayName;
    private String email;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getDisplayName() {
        return displayName;
    }

    public void setDisplayName(String displayName) {
        this.displayName = displayName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

3.kotlin引用

//实例化工具类
 ContactUtils mobiletype = ContactUtils(this)
//list为MutableList<MessageBean>  
  list = mobiletype.information
  json = Gson().toJson(list)

4.Java引用

//实例化工具类
ContactUtils mobiletype = new ContactUtils(this);
//list为List<MessageBean>
 list = mobiletype.getInformation();
 json = new Gson().toJson(list);

四、通话记录

1.LogBean

public class LogBean {
    public String id;
    public String name;
    public String number;
    public String date;
    public String duration;
    public String type;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getDuration() {
        return duration;
    }

    public void setDuration(String duration) {
        this.duration = duration;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return "LogBean{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", number='" + number + '\'' +
                ", date='" + date + '\'' +
                ", duration='" + duration + '\'' +
                ", type='" + type + '\'' +
                '}';
    }
}

2.kotlin引用

 /**
     * 获取通话记录
     */
    @SuppressLint("Range")
    private fun getLog() {
        val uri = CallLog.Calls.CONTENT_URI
        val projection = arrayOf(
            CallLog.Calls._ID,
            CallLog.Calls.CACHED_NAME,
            CallLog.Calls.NUMBER,
            CallLog.Calls.DATE,
            CallLog.Calls.DURATION,
            CallLog.Calls.TYPE
        )
        val cursor =
            contentResolver.query(uri, projection, null, null, CallLog.Calls.DEFAULT_SORT_ORDER)
        if (cursor != null && cursor.moveToFirst()) {
            do {
                val bean = LogBean()
                val id =
                    cursor.getString(cursor.getColumnIndex(CallLog.Calls._ID))
                val number =
                    cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER))
                val name =
                    cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME))
                val date =
                    cursor.getString(cursor.getColumnIndex(CallLog.Calls.DATE))
                val duration =
                    cursor.getString(cursor.getColumnIndex(CallLog.Calls.DURATION))
                val type =
                    cursor.getString(cursor.getColumnIndex(CallLog.Calls.TYPE))
                bean.setId(id)
                bean.setName(name)
                bean.setDate(date)
                bean.setType(type)
                bean.setNumber(number)
                bean.setDuration(duration)
                logbean.add(bean)
                println("获取通话记录:id: $id,name$name, number: $number, date: $date, duration: $duration, type: $type")
            } while (cursor.moveToNext())
        }
        cursor?.close()
        //logbean为可变集合MutableList<LogBean>
        json = Gson().toJson(logbean)
        println("上传文件JSON:$json")
    }

3.Java引用

 /**
     * 获取通话记录
     */
    @SuppressLint("Range")
    private void getLog() {
        Uri uri = CallLog.Calls.CONTENT_URI;
        String[] projection = new String[]{CallLog.Calls._ID, CallLog.Calls.CACHED_NAME, CallLog.Calls.NUMBER, CallLog.Calls.DATE, CallLog.Calls.DURATION, CallLog.Calls.TYPE};
        Cursor cursor = getContentResolver().query(uri, projection, null, null, CallLog.Calls.DEFAULT_SORT_ORDER);
        if (cursor != null && cursor.moveToFirst()) {
            do {
                LogBean bean = new LogBean();
                String id = cursor.getString(cursor.getColumnIndex(CallLog.Calls._ID));
                String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
                String name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME));
               String date = cursor.getString(cursor.getColumnIndex(CallLog.Calls.DATE));
               String duration = cursor.getString(cursor.getColumnIndex(CallLog.Calls.DURATION));
              String type = cursor.getString(cursor.getColumnIndex(CallLog.Calls.TYPE));
                bean.setId(id);
                bean.setName(name);
                bean.setDate(date);
                bean.setType(type);
                bean.setNumber(number);
                bean.setDuration(duration);
                //logbean为集合List<LogBean>
                logbean.add(bean);
                System.out.println("获取通话记录:" + "id: " + id + ",name" + name + ", number: " + number + ", date: " + date + ", duration: " + duration + ", type: " + type);
            } while (cursor.moveToNext());
        }
        if (cursor != null) {
            cursor.close();
        }
        json = new Gson().toJson(logbean);
    }

五、系统相册

1.ImagBean

public class ImagBean {
    private String url;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    @Override
    public String toString() {
        return "ImagBean{" +
                "url='" + url + '\'' +
                '}';
    }
}

2.kotlin

    /**
     * 获取系统相册图片
     */
    @SuppressLint("Range")
    private fun getImag() {
        val mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
        // 获得图片
        val mCursor = contentResolver.query(
            mImageUri,
            null,
            MediaStore.Images.Media.MIME_TYPE + "=? or " + MediaStore.Images.Media.MIME_TYPE + "=?",
            arrayOf("image/jpeg", "image/png"),
            MediaStore.Images.Media.DATE_MODIFIED
        )
        val count = mCursor!!.count
        println("图片数量总量:$count")
        var sl = 0
        if (count > 0) {
            while (mCursor.moveToNext()) {
                val path =
                    mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DATA)) // 路径 imageView.setImageURI(Uri.parse(path));
                val name =
                    mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME))
                val exif = ExifInterface(path)
                val date = exif.getAttribute(ExifInterface.TAG_DATETIME) + "" //时间
                if (date == "" || date == "null") {
                } else {
                    val yer: String = getStrBefore(date)
                    val yer1 = yer.replace(":".toRegex(), "-")
                    val da: String = getStrAfter(date)
                    val zzstr = "$yer1 $da"
                    val rigtime = Date().time - 24 * 30 * 60 * 60 * 1000L
                    println("图片时间打印:" + rigtime + "   " + zzstr + "    " + dateToStamp(zzstr) + "   " + Date().time)
                    if (dateToStamp(zzstr)!! > rigtime) { //一个月内的图片
                        sl++
                        //只取90张图片
                        if (imagBeanList.size < 90) {
//                        //imgPath就是压缩后的图片
//                        String imgPath = BitmapUtil.compressImageUpload(path);
                            val bean = ImagBean()
                            bean.url = path
                            //imagBeanList为 MutableList<ImagBean>
                            imagBeanList.add(bean)
                            println("图片路径打印:$path---->$name")
                        }
                    }
                }
            }
            println("图片数量一个月内图片数量:$sl")
            println("图片数量--->:" + imagBeanList.size)
            val imagjson = Gson().toJson(imagBeanList)
            println("上传文件imagBeanList数组打印:$imagjson")
        }
    }

3.Java

  /**
     * 获取系统相册图片
     */
    private void getImag() throws IOException, java.text.ParseException {
        Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        // 获得图片
        Cursor mCursor = getContentResolver().query(mImageUri, null,
                MediaStore.Images.Media.MIME_TYPE + "=? or "
                        + MediaStore.Images.Media.MIME_TYPE + "=?",
                new String[]{"image/jpeg", "image/png"}, MediaStore.Images.Media.DATE_MODIFIED);

        int count = mCursor.getCount();
        System.out.println("图片数量总量:" + count);
        int sl = 0;
        if (count > 0) {
            while (mCursor.moveToNext()) {
                @SuppressLint("Range") String path = mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DATA));// 路径 imageView.setImageURI(Uri.parse(path));
                @SuppressLint("Range") String name = mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
                ExifInterface exif = new ExifInterface(path);
                String date = exif.getAttribute(ExifInterface.TAG_DATETIME) + "";//时间
                if (date.equals("") || date.equals("null")) {

                } else {
                    String yer = getStrBefore(date);
                    String yer1 = yer.replaceAll(":", "-");
                    String da = getStrAfter(date);
                    String zzstr = yer1 + " " + da;
                    long rigtime = new Date().getTime() - 24 * 30 * 60 * 60 * 1000L;
                    System.out.println("图片时间打印:" + rigtime + "   " + zzstr + "    " + dateToStamp(zzstr) + "   " + new Date().getTime());

                    if (dateToStamp(zzstr) > rigtime) {//一个月内的图片
                        sl++;
                        if (imagBeanList.size() < 90) {
//                        //imgPath就是压缩后的图片
//                        String imgPath = BitmapUtil.compressImageUpload(path);
                            ImagBean bean = new ImagBean();
                            bean.setUrl(path);
                            //这里的imagBeanList为List<ImagBean>
                            imagBeanList.add(bean);
                            System.out.println("图片路径打印:" + path + "---->" + name);
                        }
                    }
                }
            }
            System.out.println("图片数量一个月内图片数量:" + sl);
            System.out.println("图片数量--->:" + imagBeanList.size());
            String imagjson = new Gson().toJson(imagBeanList);
            System.out.println("imagBeanList数组打印:" + imagjson);
        }
    }

4.将时间转换为时间戳

1.kotlin

 @Throws(android.net.ParseException::class, ParseException::class)
    fun dateToStamp(time: String?): Long? {
        val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
        val date = simpleDateFormat.parse(time)
        return date.time
    }

2.java

   public Long dateToStamp(String time) throws ParseException, java.text.ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = simpleDateFormat.parse(time);
        long ts = date.getTime();
        return ts;
    }

5.截取特定字符前后方法

1.kotlin

 //截取字符串前面文本
    private fun getStrBefore(query: String): String {
        val split = query.split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
        return split[0]
    }

    //截取字符串后面文本
    private fun getStrAfter(query: String): String {
        val split = query.split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
        return split[1]
    }

2.Java

    //截取字符串前面文本
    private String getStrBefore(String query) {
        String[] split = query.split(" ");
        String result = split[0];
        return result;
    }

    //截取字符串后面文本
    private String getStrAfter(String query) {
        String[] split = query.split(" ");
        String result = split[1];
        return result;
    }

六、JSON字符串写成文件

把获取到这些转为JSON字符串后写入文件,把文件传给后台

1.kotlin


    fun WriteSd(str: String): File? {
        println("字符串打印:$str")
        try {
            val dirPath =
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).path + "/contact"
            val dir = File(dirPath)
            if (!dir.exists()) {
                //创建目录
                dir.mkdirs()
            }
            val file = File(dir.canonicalPath + "/" + "contact.json")
            if (file.exists()) {
                file.delete()
            }
            file.createNewFile()
            val out = FileOutputStream(file)
            val outputStreamWrite = OutputStreamWriter(out, "utf-8")
            outputStreamWrite.write(str)
            outputStreamWrite.close()
            out.close()
            println("文件写入成功:" + file.canonicalPath)
            return file
        } catch (e: java.lang.Exception) {
            println("文件写入失败:" + e.message)
            e.printStackTrace()
        }
        return null
    }

2.Java

    private File WriteSd(String str) {
        System.out.println("字符串打印:" + str);
        try {
            String dirPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getPath() + "/contact";
            File dir = new File(dirPath);
            if (!dir.exists()) {
                //创建目录
                dir.mkdirs();
            }
            File file = new File(dir.getCanonicalPath() + "/" + "contact.json");
            if (file.exists()) {
                file.delete();
            }
            file.createNewFile();
            FileOutputStream out = new FileOutputStream(file);
            OutputStreamWriter outputStreamWrite = new OutputStreamWriter(out, "utf-8");
            outputStreamWrite.write(str);
            outputStreamWrite.close();
            out.close();
            System.out.println("文件写入成功:" + file.getCanonicalPath());
            return file;
        } catch (Exception e) {
            System.out.println("文件写入失败:" + e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

3.引用

1.kotlin

val file: File = WriteSd(json)!!

2.Java

File file = WriteSd(json);

总结

这篇文章比较长,懒得分开成几篇博客去写,直接一篇归纳得了,需要的认真看完,需要当中单独哪一个都可以,欢迎指正!文章来源地址https://www.toymoban.com/news/detail-575705.html

到了这里,关于Android之抓取短信,所有应用信息,通讯录,通话记录,手机系统相册图片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【创作赢红包】循序渐进的全版本通讯录详解,可保存信息的动态通讯录

    之前的博客里我们实现了 静态 的通讯录。|ू・ω・` ) 静态通讯录,适合初学者的手把手一条龙讲解_陈大大陈的博客-CSDN博客 这个版本的通讯录 无法实现容量的动态增加,也无法保存我们输入的信息。(•́へ•́╬) 静态通讯录,是直接开辟100块空间内存来供使用,但是这样

    2023年04月17日
    浏览(68)
  • Android手机通讯录制作

    设计一个基于Android的手机通讯录,此通讯录包括添加、搜索、修改、删除联系人的功能。 添加、编辑、删除功能 点击通讯录主界面选项菜单中的“添加联系人”菜单项,进入添加联系人界面,输入联系人的基本信息,包括姓名、手机号码、家庭地址、单位名称、Email、QQ号这

    2024年02月08日
    浏览(59)
  • Android手机通讯录(上)

    可以实现添加联系人,删除联系人,修改联系人,查找号码,查询联系人信息等功能。 具体实现界面如图所示。 相关代码介绍如下: Android项目配置AndroidManifest.xml 手机通讯录程序主界面类MyContactsActivity.java 手机通讯录程序数据库类MyDB.java 手机通讯录程序添加、编辑、查看信

    2024年02月12日
    浏览(53)
  • 基于Android的手机通讯录设计

    目 录 1.系统描述 1 1.1 问题描述 1 1.2 功能描述 1 1.3 数据需求 2 1.4 设计意义 2 2.背景介绍 2 2.1 Android系统概述 2 2.2 Android开发组件 4 2.2.1 Activity组件 4 2.2.2 Service 组件 7 2.2.3 BroadcastReceiver 组件 8 2.2.4 Content Provider 组件 8 2.3 Android数据库 9 2.3.1 SQLite数据库 9 2.3.2 SQLite数据库特点 10

    2024年02月09日
    浏览(79)
  • python实现手机通讯录和学生信息管理系统(4种方法)

    1.手机通讯录: 通讯录是记录了联系人姓名和联系方式的名录,手机通讯录是最常见的通讯录之一,人们可以在通讯录中通过姓名查看相关联系人的联系方式、邮箱、地址等信息,也可以在其中新增联系人,或修改、删除联系人信息。下面是一个常见通讯录的功能菜单,如图

    2024年02月09日
    浏览(71)
  • kali 使用后台进行手机拍照,查看定位,获取信息,(通讯录等操作)

    控制安卓手机拍照,查看定位,获取通信录 引言 准备工作 1. kali、手机 2.戴上眼睛注意别敲错命令,复制的时候注意看! 开始了!!! First Second ** 大家好,我是Zues,今天我来教会大家一个入侵安卓手机控制手机拍照,查看定位,获取通信录,查看手机内容。 本作品只适用于

    2024年02月20日
    浏览(44)
  • Android Studio 简易通讯录制作 (Java)

    通讯录首页:  添加联系人页面:  修改联系人: 删除联系人:  程序代码: MainActivity.java MyAdapter.java  DBHelper.java User.java  activity_main.xml dialog.xml  item.xml colors.xml  详细见:https://gitee.com/love1213/Android-Studio-Contacts.git

    2024年02月11日
    浏览(44)
  • 基于java的Android手机通讯录【详细】【完整代码】

    提示:代码在基本模块中,教程纯文字,推荐两个屏幕一边看代码一边看教程 简易Android通讯录系统,只要半天就能写完! (博主安卓一些功能用的不熟练) 需要掌握学习的知识点: 1、基本的UI界面编写。 2、Intent的基本使用。 3、Menu的基本使用。 4、RecyclerView的基本使用。

    2024年02月09日
    浏览(46)
  • Flutter Android & IOS 获取通讯录联系人列表

    1.在 pubspec.yaml 文件中添加 contacts_service 和 permission_handler 插件的依赖: 2.在你的 Dart 代码中,导入 contacts_service 插件: 3.权限请求: Android 需要在 android/app/src/main/AndroidManifest.xml 文件中添加以下内容: IOS 需要在 ios/Runner/Info.plist 文件中添加以下内容: 在ios系统上如果进行

    2024年02月08日
    浏览(52)
  • 【数据结构】:顺序表及其通讯录应用

    1.1为什么会存在数据结构? 我们常常接触到诸如生活中的姓名、身份证、网页内的图片、视频等各种各样的信息,这些信息就是我们常说的数据。在使用这些数据时,我们发现随着数据的增加,当我们要单独寻找某一个数据时就会非常困难,就像图书馆内书籍如果没有按一定

    2024年04月26日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包