1. 程式人生 > >Unity獲取手機通訊錄《一》 安卓端

Unity獲取手機通訊錄《一》 安卓端

     研究AndroidStudio已經半個月了,就為了寫一個給unity用的arr包其實也就是jar包。真的是一路坎坷,鼻青臉腫,問專業做安卓開發的朋友竟然也是一臉懵,即便從github拿來的原始碼都無從下手,眼看著時間一天天推進日子一天天過,這個問題還不能解決真的是茶不思飯不想。剛好又趕上最近搬家心好累啊,在上海這地方寸土寸金,看來還得找時間讓老闆加薪,不然老婆就跑了。不扯了入正題,

不知道unity如何跟安卓建立互動的可以去看我之前的部落格,在這裡就不講unity安卓互動了。開發過程有問題的歡迎留言,放心絕對會有讓你抓狂的各種問題。

獲取通訊錄:

首先在新建的工程下新建一個library型別的Module,具體操作自己摸索很簡單。

建一個java類用來管理通訊錄

package com.crf.xfd.entrty;

import android.text.TextUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ContactBean {
    private String name;
    private String phoneNumber;
    private String email;

    public String getName() {
        if (TextUtils.isEmpty(name)){
            return "";
        }
        return name;
    }

    public String getPhoneNumber() {
        if (TextUtils.isEmpty(phoneNumber)){
            return "";
        }
        return phoneNumber;
    }

    public String getEmail() {
        if (TextUtils.isEmpty(email)){
            return "";
        }
        return email;
    }

    public void setEmail(String email) {
        if (TextUtils.isEmpty(email)){
            this.email="";
        }else {

            this.email = email;
        }
    }

    public void setPhoneNumber(String phoneNumber) {
        if (TextUtils.isEmpty(phoneNumber)){
            if (TextUtils.isEmpty(this.phoneNumber)){
                this.phoneNumber="";
            }
        }else {
            Pattern p = Pattern.compile("\\s*|\t|\r|\n|");
            Matcher m = p.matcher(phoneNumber);
            phoneNumber = m.replaceAll("");
            phoneNumber = phoneNumber.replaceAll("\\-", "");
            if (TextUtils.isEmpty(this.phoneNumber)){
                this.phoneNumber=phoneNumber;
            }else {
                this.phoneNumber+=","+phoneNumber;
            }
        }

    }

    public void setName(String name) {
        if (TextUtils.isEmpty(name)){
            this.name="";
        }else {

            this.name = name;
        }
    }

    @Override
    public String toString() {
        return "{\"phone_name\"" + ":\"" +name + "\"," +
                "\"phone_number\"" +":\"" +phoneNumber + "\"" + '}';
    }
}

然後再來一個類獲取遍歷手機上的資訊

package com.crf.xfd.entrty;

import android.text.TextUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ContactBean {
    private String name;
    private String phoneNumber;
    private String email;

    public String getName() {
        if (TextUtils.isEmpty(name)){
            return "";
        }
        return name;
    }

    public String getPhoneNumber() {
        if (TextUtils.isEmpty(phoneNumber)){
            return "";
        }
        return phoneNumber;
    }

    public String getEmail() {
        if (TextUtils.isEmpty(email)){
            return "";
        }
        return email;
    }

    public void setEmail(String email) {
        if (TextUtils.isEmpty(email)){
            this.email="";
        }else {

            this.email = email;
        }
    }

    public void setPhoneNumber(String phoneNumber) {
        if (TextUtils.isEmpty(phoneNumber)){
            if (TextUtils.isEmpty(this.phoneNumber)){
                this.phoneNumber="";
            }
        }else {
            Pattern p = Pattern.compile("\\s*|\t|\r|\n|");
            Matcher m = p.matcher(phoneNumber);
            phoneNumber = m.replaceAll("");
            phoneNumber = phoneNumber.replaceAll("\\-", "");
            if (TextUtils.isEmpty(this.phoneNumber)){
                this.phoneNumber=phoneNumber;
            }else {
                this.phoneNumber+=","+phoneNumber;
            }
        }

    }

    public void setName(String name) {
        if (TextUtils.isEmpty(name)){
            this.name="";
        }else {

            this.name = name;
        }
    }

    @Override
    public String toString() {
        return "{\"phone_name\"" + ":\"" +name + "\"," +
                "\"phone_number\"" +":\"" +phoneNumber + "\"" + '}';
    }
}

最後在跟unity互動的單例類呼叫

package com.crf.xfd;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.widget.Toast;

import com.crf.xfd.entrty.CallLogInfoBean;
import com.crf.xfd.entrty.ContactBean;
import com.crf.xfd.entrty.NativeAppInfoBean;
import com.crf.xfd.tools.CallLogUtils;
import com.crf.xfd.tools.ContactUtil;
import com.crf.xfd.tools.NativeAppUtils;
import com.crf.xfd.tools.PermissionUtil;
import com.unity3d.player.UnityPlayerActivity;

import java.util.List;

public class GetInfoManager  extends UnityPlayerActivity{

    private int callLogRequestCode = 1;
    private int contactRequestCode = 2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
    }
    // 獲取本機安裝應用的列表
    public String GetAppList(){
        try {
            List<NativeAppInfoBean> allApps = NativeAppUtils.getAllApps(this, 0);
            return  "{\"app_list\":"+ allApps.toString()+"}";
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            return null;
        }
    }
    //獲取本機通訊錄
    @RequiresApi(api = Build.VERSION_CODES.M)
    public String GetContact(){
        boolean isReadContact = checkPermission(Manifest.permission.READ_CONTACTS);
        if (isReadContact) {
            return readContact();
        } else {
            requestPerssion(new String[]{Manifest.permission.READ_CONTACTS}, contactRequestCode);
            return null;
        }
    }
    //讀取本機通話記錄
    @RequiresApi(api = Build.VERSION_CODES.M)
    public String GetCallLog(){
        boolean b = checkPermission(Manifest.permission.READ_CALL_LOG);
        if (b) {
            return readCallLog();
        } else {
            requestPerssion(new String[]{Manifest.permission.READ_CALL_LOG}, callLogRequestCode);
            return null;
        }
    }

    /**
     * 讀取通話記錄
     */
    private String readCallLog() {
        List<CallLogInfoBean> callLogInfos = CallLogUtils.getCallLogInfos(this, 0);
        return  "{\"records\":" + callLogInfos.toString()+"}";
    }

    /**
     * 讀取本機通訊錄資訊
     *
     * @throws Throwable
     */
    private String readContact() {
        try {
            List<ContactBean> allContact = ContactUtil.getAllContact(this);
            return "{\"phones\":" + allContact.toString() +"}";
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            return null;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == callLogRequestCode) {
            readCallLog();
        } else if (requestCode == contactRequestCode) {
            readContact();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (callLogRequestCode == requestCode) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //已經授權
                readCallLog();

            } else {
                //點選了不再提示,拒絕許可權
                if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) {
                    //跳轉到設定介面
                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    Uri uri = Uri.fromParts("package", getPackageName(), null);
                    intent.setData(uri);
                    startActivityForResult(intent, callLogRequestCode);

                } else {
                    Toast.makeText(this, "許可權拒絕", Toast.LENGTH_SHORT).show();
                }
            }
        } else if (contactRequestCode == requestCode) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //已經授權
                readContact();

            } else {
                //點選了不再提示,拒絕許可權
                if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) {
                    //跳轉到設定介面
                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    Uri uri = Uri.fromParts("package", getPackageName(), null);
                    intent.setData(uri);
                    startActivityForResult(intent, callLogRequestCode);

                } else {
                    Toast.makeText(this, "許可權拒絕", Toast.LENGTH_SHORT).show();

                }
            }
        }
    }

    /**
     * 檢查許可權
     *
     * @param permission
     * @return
     */
    @RequiresApi(api = Build.VERSION_CODES.M)
    public boolean checkPermission(String permission) {
        boolean b = PermissionUtil.checkPermissionWrapper(this, permission);
        return b;
    }

    /**
     * 申請許可權
     *
     * @param permission
     * @param requestCode
     */
    public void requestPerssion(String[] permission, int requestCode) {
        PermissionUtil.requestPermissionsWrapper(this, permission, requestCode);
    }
}

期間打包執行後需要在AndroidStudio上開執行輸出日誌,別笑話我剛開始這個日誌輸出面板我都找不到


最後打包在手機上執行的截圖:


我會把原始碼跟工程地址直接貼給大家

下一篇簡單講解通話記錄的獲取

相關推薦

Unity獲取手機通訊錄

     研究AndroidStudio已經半個月了,就為了寫一個給unity用的arr包其實也就是jar包。真的是一路坎坷,鼻青臉腫,問專業做安卓開發的朋友竟然也是一臉懵,即便從github拿來的原始碼都無從下手,眼看著時間一天天推進日子一天天過,這個問題還不能解決真的是茶

Unity獲取手機通話記錄《二》

上一篇簡單記錄了一下unity獲取通訊錄的過程,這一篇咱們就瞭解一下通話記錄跟app列表的獲取,其實大體流程跟上一篇的獲取通訊錄一樣的,只不過程式碼不一樣而已,時間因素我就不詳細解說直接上程式碼有疑問的可以在下面留言我看到了能幫就會幫。我會把原始碼跟工程地址直接貼給大家獲取通

Unity截圖儲存到手機相簿

1、首先本人同樣用了和大家一樣的方法在百度查了很久的資料,之後又看API,官方幫助文件,之後終於解決了這個問題。在網上查到的都是程式碼幾乎都是一個模子刻出來的,現在貼上我自己查了資料後改的程式碼。 2、直接上原始碼,簡單粗暴 using UnityEngine; using Syst

unity_AR() 手機無法顯示模型和無法播放動畫問題

這個星期學習了unity製作MMD動畫打包成apk到手機上發現了發現了兩個問題 一: 手機無法顯示MMD外掛渲染的貼圖,導致安裝到手機上後無法顯示模型 解決方法: 把材質球的shader改成這樣:   transparent->cutout

Unity 儲存圖片到手機相簿(、蘋果)

首先說一下安卓:首先在相簿裡建立一個檔案,然後將圖片存入。 程式碼: using UnityEngine; using System.Collections; using System.IO; public class SavaPicture : MonoBehaviou

微信跳跳純實現方法

  微信跳一跳出來好長了,有點時間就沉迷ow,最近有點時間開始看看跳一跳,無奈手殘黨,沒超過100分過,看到朋友圈動不動五六百,也確實佩服那些流弊的人,手殘怎麼辦,於是看到有大神用Python實現自動刷分,確實厲害,無奈Python一點不懂,博主是個Java黨,作為跨平臺的J

通過http對Mysql進行增刪改查

name 交流 shm != 用戶 習慣 cti -perm 得到 各類it學習視頻,大家都可以看看哦!我自己本人都是通過這些來學習it只知識的! 下面是視頻鏈接轉自:http://www.cnblogs.com/wangying222/p/5492935.html ht

關於微信內置瀏覽器session丟失問題

共享 bsp 由於 session共享 ssi 客戶 replace -a 導致 項目上線測試,發現微信安卓端存在用戶登錄無法驗證session情況, 導致每次接口請求都無法識別,而蘋果客戶端不會出現此問題,非微信環境打開不會出現此問題,找到一些解決方案做下記錄: 方案1:

網狐榮耀版的簽名與打包

nbsp 生成 輸入 sso keystore png conf oid 分享 第一、打開ADT,選擇file-import,加載榮耀版安卓項目,如下圖 第二,右鍵項目,選擇export,進入下圖界面,選擇android,然後再選擇Export Android App

社群系統ThinkSNS+第4階段更新播報

基本 設置圖 當前 用戶中心 QQ 魅族 群組 變化 全部 研發發布版本號:V1.8 發布時間:2018年5月15日星期二 本次發布類型:移動端優化,新增功能發布 社交系統ThinkSNS+商業授權版各端更新內容如下: 一、新增內容: 1. 小視頻; 2. 動態、

ReactNative報錯Could not find play-services-basement.aar

這兩天同事在寫專案的過程中,啟動Android端進行編譯報瞭如上的錯誤,從報錯中可以知道,是因為第三方庫react-native-device-info引起的,從其原始碼中可以看到: 它的安卓部分依賴了google的服務,為啥要依賴這個服務呢?不是特別清楚。既然罪魁禍首是這個庫,就去gi

諾基亞手機嚐鮮9.0

導讀 北京時間2018年10月5日,HMD在倫敦的釋出會上正式釋出了諾基亞7.1。在會上,官方還公佈了旗下諾基亞手機的安卓9.0 Pie升級計劃,讓人十分期待。 HMD表示,會有四款諾基亞手機將在近期獲得安卓9.0 Pie升級,它們分別是

什麼叫車牌識別sdk?

安卓端車牌識別sdk 安卓前端車牌識別技術是像要像掃二維碼那樣去識別車牌。此OCR軟體對車牌顏色、車牌號進行識別。為促進人工智慧化建設研發而來的應用。此應用基於移動端平臺,手機、PDA、安卓系統帶200萬畫素以上的攝像頭,該安卓移動端前端車牌識別技術sdk,支援android、ios等。Android平臺提

什麽叫車牌識別sdk?

視頻流 清晰 種類 ocr識別 ext 設備 proc android平臺 百度搜 安卓端車牌識別sdk 安卓前端車牌識別技術是像要像掃二維碼那樣去識別車牌。此OCR軟件對車牌顏色、車牌號進行識別。為促進人工智能化建設研發而來的應用。此應用基於移動端平臺,手機、PDA、安卓

ionic學習(十):ionic3專案打包成手機瀏覽器、apk專案

主要目的:將ionic專案打包成手機瀏覽器的專案,可以測試掃描二維碼等手機可用的功能。 步驟: 1. 新增瀏覽器打包環境 ionic cordova platform add browser   2. 打包:   ionic

獲取並輸出當前裝置的系統資訊

String TAG = "SystemInfo";String board = Build.BOARD;Log.i("TAG",String.Format("主機板資訊:%s",board));String brand = Build.BRAND;Log.i("TAG",String.Form

unity手遊開發--開發專案除錯列印日誌工具

using UnityEngine; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; public class logdata {    

如何利用LRUCache製作谷歌地圖的三級快取

第一個檔案,繼承ArcGIS的TileServerLayer /** * * @author wjf * @date 2018/09/30 */ public class GoogleMapLayer extends TiledServiceLayer {

Android/Unity實戰篇:檢視真機執行時的Debug資訊

當我們在開發的時候,我們可以方便的用Debug來除錯程式,可是,有些問題恰巧出現在真機測試的時候,網上已經有了很多教程,可總是不完整,故在此寫一個完整版,供大家參考。 手機設定 使用USB連線電腦,開啟開發者模式,開啟USB除錯,允許除錯 電腦設定 找到安卓SDK所在目錄,

Unity獲取手機資訊

Unity的原生類UnityEngine.SystemInfo 以前為了獲取手機的一些資訊去寫一些Android或著IOS的原生指令碼最近才發現Unity已經為開發者準備好了這些介面。在Unity中有一個UnityEngine.SystemInfo的類。