引言
在开发移动应用时,处理电话功能和通话记录是常见的需求。本文将介绍如何使用uniapp和Android原生API来实现一个PhoneUtility类,该类可以拨打电话、获取通话记录以及监听电话状态。同时,我们将讨论如何在app.vue中引入全局监听功能,以便在应用启动时自动初始化这些功能。
使用方法,直接在app.vue中引入全局监听或者在需要的地方引入
<script>
import callPhone from "@/utils/callPhone.js"
export default {
onLaunch: function() {
callPhone.init()
console.log('App Launch')
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
}
}
</script>
具体代码实现如下
PhoneUtility类封装了电话相关的操作,包括拨打电话、获取通话记录以及监听电话状态。
class PhoneUtility {
constructor() {
this.Intent = plus.android.importClass("android.content.Intent");
this.Uri = plus.android.importClass("android.net.Uri");
this.mainActivity = plus.android.runtimeMainActivity();
this.CallLog = plus.android.importClass("android.provider.CallLog");
}
init() {
plus.android.requestPermissions([
'android.permission.READ_CALL_LOG',
'android.permission.WRITE_CALL_LOG',
'android.permission.CALL_PHONE'
], res => {
if (res.granted.length > 0) {
console.log('已授权');
// 可以在这里调用其他方法,比如获取通话记录
} else {
uni.showToast({
title: "通话记录权限未开启",
icon: 'none'
});
console.log('请先授权');
}
});
}
//拨打电话
callPhone(data) {
const uri = this.Uri.parse("tel:" + data);
const callIntent = new this.Intent("android.intent.action.CALL", uri);
this.mainActivity.startActivity(callIntent);
}
//调取通话记录
callLog() {
const main = this.mainActivity;
const obj = main.getContentResolver();
plus.android.importClass(obj);
const day2 = new Date();
day2.setTime(day2.getTime());
const s2 = `${day2.getFullYear()}-${day2.getMonth() + 1}-${day2.getDate()}`;
const day3 = new Date();
day3.setTime(day3.getTime() + 24 * 60 * 60 * 1000);
const s3 = `${day3.getFullYear()}-${day3.getMonth() + 1}-${day3.getDate()}`;
const selection = {
mobile: '',
startTime: new Date(s2).getTime(),
endTime: new Date(s3).getTime(),
type: ''
};
let sql = '';
let keyword = '';
for (const item in selection) {
if (selection[item] !== '') {
switch (item) {
case 'mobile':
sql = sql ? `${sql} and ` : '';
sql += `${this.CallLog.Calls.NUMBER} like '%${selection[item]}%'`;
keyword = selection[item];
break;
case 'startTime':
sql = sql ? `${sql} and ` : '';
sql += `${this.CallLog.Calls.DATE}>=${selection[item]}`;
break;
case 'endTime':
sql = sql ? `${sql} and ` : '';
sql += `${this.CallLog.Calls.DATE}<=${selection[item]}`;
break;
case 'type':
sql = sql ? `${sql} and ` : '';
sql += `${this.CallLog.Calls.TYPE}=${selection[item]}`;
break;
}
}
}
sql = sql || null;
const cursor = main.getContentResolver().query(
this.CallLog.Calls.CONTENT_URI,
null,
sql,
null,
null
);
plus.android.importClass(cursor);
const content = [];
let count = 0;
if (cursor.moveToFirst()) {
do {
count++;
const number = cursor.getString(cursor.getColumnIndex(this.CallLog.Calls.NUMBER));
let type;
switch (parseInt(cursor.getString(cursor.getColumnIndex(this.CallLog.Calls.TYPE)), 10)) {
case this.CallLog.Calls.INCOMING_TYPE:
type = "呼入";
break;
case this.CallLog.Calls.OUTGOING_TYPE:
type = "呼出";
break;
case this.CallLog.Calls.MISSED_TYPE:
type = "未接";
break;
default:
type = "挂断";
break;
}
const date = new Date(parseInt(cursor.getString(cursor.getColumnIndexOrThrow(this.CallLog.Calls
.DATE)), 10));
const name = cursor.getString(cursor.getColumnIndexOrThrow(this.CallLog.Calls.CACHED_NAME));
const numberLocation = cursor.getString(cursor.getColumnIndex(this.CallLog.Calls
.GEOCODED_LOCATION));
const duration = cursor.getString(cursor.getColumnIndexOrThrow(this.CallLog.Calls.DURATION));
content.push({
name: name,
mobile: number,
numberLocation: numberLocation,
callTime: 0,
talkTime: duration,
type: type
});
if (count > 50) break;
} while (cursor.moveToNext());
}
console.log(content[content.length - 1]);
}
PhoneState(data) {
const Contexttest = plus.android.importClass("android.content.Context");
const telephonyManager = plus.android.importClass("android.telephony.TelephonyManager");
const telManager = this.mainActivity.getSystemService(Contexttest.TELEPHONY_SERVICE);
const receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {
onReceive: (Contexttest, intent) => {
plus.android.importClass(intent);
console.log(intent.getAction());
const phonetype = telManager.getCallState();
const phoneNumber = intent.getStringExtra(telephonyManager.EXTRA_INCOMING_NUMBER);
console.log("phonetype:" + phonetype); //电话状态 0->空闲状态 1->振铃状态 2->通话存在
console.log(phoneNumber, '电话号码');
switch (phonetype) {
case 0:
// this.callLog();//通话记录
console.log('aaa');
break;
case 1:
console.log('bbb');
break;
case 2:
console.log('ccc');
break;
}
}
});
const IntentFilter = plus.android.importClass('android.content.IntentFilter');
const filter = new IntentFilter();
filter.addAction(telephonyManager.ACTION_PHONE_STATE_CHANGED);
this.mainActivity.registerReceiver(receiver, filter);
}
}
export default PhoneUtility;