React Native 獲取通話時長

React Native不能直接獲取通話時長,須要經過iOS和安卓的原生代碼寫橋接文件獲取通話時長

iOS 經過CXCallObserver設置一個代理來隨時捕獲電話信息的更新,裏邊有呼叫中、接聽、掛斷等狀態,記錄通話時長,而後傳遞給JS,代碼以下:
#import "RNCallBridgeModule.h"
#import <CallKit/CXCallObserver.h>
#import <CallKit/CXCall.h>

@interface RNCallBridgeModule()<CXCallObserverDelegate>

@property (nonatomic, strong) CXCallObserver *callObserver;
@property (nonatomic, strong) NSDate * startDate; //記錄開始時間
@property (nonatomic, strong) NSDate * endDate; //記錄結束時間
@property (nonatomic, copy) NSString *phoneNumber; //呼叫的手機號
@property (nonatomic, copy) RCTPromiseResolveBlock passCallTimeResolve; //通話後返回給JS的回調函數
@property (nonatomic, copy) RCTPromiseRejectBlock passCallTimeRejecter;

@end

@implementation RNCallBridgeModule

RCT_EXPORT_MODULE();

// 打電話 設置代理來隨時捕獲電話信息的更新
RCT_EXPORT_METHOD(call:(NSString *)phone)
{
dispatch_async(dispatch_get_main_queue(), ^{
NSString *phoneStr = [NSString stringWithFormat:@"telprompt://%@",phone];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneStr] options:@{} completionHandler:^(BOOL success) {
NSLog(@"success");
if (!success) return;
self.phoneNumber = phone;
self->_callObserver = [[CXCallObserver alloc] init];
[self->_callObserver setDelegate:self queue:dispatch_get_main_queue()];
}];
});
}

// 打電話代理 監聽通話狀態
- (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call {
if (call.outgoing && call.hasConnected && !call.hasEnded) {
_startDate = [NSDate date];
}
if (call.outgoing && call.hasConnected && call.hasEnded) {
_endDate = [NSDate date];
NSDate* dat = [NSDate dateWithTimeInterval:0 sinceDate:_startDate];
NSTimeInterval a=[dat timeIntervalSinceNow];
NSString *timeString = [NSString stringWithFormat:@"%0.f",fabs(a)];//轉爲字符型
[self passCallTime:timeString];
self.phoneNumber = nil;
self.startDate = nil;
self.endDate = nil;
}
}

// 存儲回調函數
RCT_REMAP_METHOD(passCallTime,
passCallTimeResolve:(RCTPromiseResolveBlock)passCallTimeResolve
passCallTimeRejecter:(RCTPromiseRejectBlock)passCallTimeRejecter)
{
self.passCallTimeResolve = passCallTimeResolve;
self.passCallTimeRejecter = passCallTimeRejecter;
}

// 傳遞通話時長
- (void)passCallTime:(NSString*)time
{
NSString *startStampTime = [NSString stringWithFormat:@"%lf", [self.startDate timeIntervalSince1970]];
NSString *endStampTime = [NSString stringWithFormat:@"%lf", [self.endDate timeIntervalSince1970]];
self.passCallTimeResolve(@{@"callTime": time, @"phoneNumber": self.phoneNumber, @"startTime":startStampTime, @"endTime":endStampTime});
}

@end
複製代碼

JS調用原生橋接方法

const CallModule = NativeModules.RNCallBridgeModule
CallModule.call(phone)

const dic = await CallModule.passCallTime()
// dic.callTime 就是通話時長
複製代碼

Android

//安卓的權限
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_CALL_LOG" />
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />


import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;

public class RNCallBridgeModule extends ReactContextBaseJavaModule {
private Promise callPromise;
private ReactApplicationContext reactContext;

public RNCallBridgeModule(ReactApplicationContext reactContext) {
super(reactContext);
this.reactContext = reactContext;
}

@Override
public String getName() {
return "RNCallBridgeModule";
}

@ReactMethod
public void passCallTime(Promise callPromise) {
this.callPromise = callPromise;
}

@ReactMethod
public void call(String phoneNumber) {
if (getCurrentActivity() instanceof MainActivity) {
((MainActivity) getCurrentActivity()).startCallPhone(phoneNumber, this);
}
}

@ReactMethod
public void endCall(CallEntity callEntity) {
if (callEntity == null) {
callEntity = new CallEntity();
}
String startDate = callEntity.getStartDate() == null ? null : String.valueOf(callEntity.getStartDate().getTime());
String endDate = callEntity.getEndDate() == null ? null : String.valueOf(callEntity.getEndDate().getTime());
WritableMap map = Arguments.createMap();
map.putInt("callTime", callEntity.getDuration());
map.putString("phoneNumber", callEntity.getPhone());
map.putString("startTime", startDate);
map.putString("endTime", endDate);
this.callPromise.resolve(map);
System.out.println(callEntity.toString());
}
}
複製代碼
相關文章
相關標籤/搜索