1. ohos端建立通道
const permissions: Array<Permissions> = ['ohos.permission.READ_CONTACTS','ohos.permission.WRITE_CONTACTS']
export default class FlutterContactsPlugin implements FlutterPlugin, MethodCallHandler, AbilityAware {
private channel: MethodChannel | null = null;
private eventChannel : EventChannel | null = null;
private flutterContacts = new FlutterContacts();
private context: common.UIAbilityContext | null = null;
private eventSink: EventSink | null = null;
constructor() {
}
onAttachedToAbility(binding: AbilityPluginBinding): void {
this.context = binding.getAbility().context;
}
onDetachedFromAbility(): void {
this.context = null;
}
getUniqueClassName(): string {
return "FlutterContactsPlugin"
}
onAttachedToEngine(binding: FlutterPluginBinding): void {
this.channel = new MethodChannel(binding.getBinaryMessenger(), "github.com/QuisApp/flutter_contacts");
this.channel.setMethodCallHandler(this);
this.eventChannel = new EventChannel(binding.getBinaryMessenger(), "github.com/QuisApp/flutter_contacts/events");
this.eventChannel.setStreamHandler(this)
}
onDetachedFromEngine(binding: FlutterPluginBinding): void {
if (this.channel != null) {
this.channel.setMethodCallHandler(null)
}
}
async onMethodCall(call: MethodCall, result: MethodResult) {
switch (call.method) {
case "requestPermission":
const atManager:abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(this.context, permissions).then((data) => {
Log.d(TAG, `requestPermissionsFromUser success, statue is ${JSON.stringify(data)}`);
const grantStatus: Array<number> = data.authResults;
const readContactsResult = 0;
const writeContactsResult = 1;
result.success(grantStatus[readContactsResult] == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED && grantStatus[writeContactsResult] == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED);
}).catch((err: BusinessError)=>{
result.success(false);
Log.e(TAG, `requestPermissionsFromUser failed, code is ${err.code}, message is ${err.message}`);
});
break;
case "select":
let args: MethodCall = call.args;
let id: string = args[0];
let withProperties: boolean = args[1];
let withThumbnail: boolean = args[2];
let withPhoto: boolean = args[3];
let withGroups: boolean = args[4];
let withAccounts: boolean = args[5];
let returnUnifiedContacts: boolean = args[6];
let includeNonVisible: boolean = args[7];
let contact: List<Map<string, ESObject>> = await this.flutterContacts.select(
this.context!!,
id,
withProperties,
withThumbnail,
withPhoto,
withGroups,
withAccounts,
returnUnifiedContacts,
includeNonVisible,
);
result.success(contact);
break;
case "insert":
let contactInsert: Map<string, ESObject> = call.args[0];
let insertResult: Map<string, ESObject> = await this.flutterContacts.insert(this.context!!, contactInsert);
if (this.eventSink != null) {
this.eventSink.success(true);
}
result.success(insertResult);
break;
case "update":
let contactUpdate: Map<string, ESObject> = call.args[0];
let withGroupsUpdate: boolean = call.args[1];
const updateResult: Map<string, ESObject> = await this.flutterContacts.update(this.context!!, contactUpdate, withGroupsUpdate)
if (this.eventSink != null) {
this.eventSink.success(true);
}
result.success(updateResult);
break;
case "delete":
this.flutterContacts.delete(this.context!!, call.args as List<string>);
if (this.eventSink != null) {
this.eventSink.success(true)
}
result.success(null);
case "getGroups":
result.success(await this.flutterContacts.getGroups(this.context!!));
break;
case "insertGroup":
result.success(null);
break;
case "updateGroup":
result.success(null);
break;
case "deleteGroup":
result.success(null);
break;
case "openExternalView":
let idView: string = call.args[0]
this.flutterContacts.openExternalViewOrEdit(this.context!!, idView, false);
result.success(null);
break;
case "openExternalEdit":
let idEdit: string = call.args[0]
this.flutterContacts.openExternalViewOrEdit(this.context!!, idEdit, true);
if (this.eventSink != null) {
this.eventSink.success(true)
}
result.success(null);
break;
case "openExternalPick":
result.success(await this.flutterContacts.openExternalPick());
break;
case "openExternalInsert":
let contactInsertData: Map<string, ESObject> = call.args[0];
this.flutterContacts.openExternalInsert(this.context!!, contactInsertData);
if (this.eventSink != null) {
this.eventSink.success(true)
}
result.success(null);
break;
}
}
onListen(arg: ESObject, events: EventSink): void{
if (events !== null) {
this.eventSink = events;
}
}
onCancel(arg: ESObject) {
this.eventSink = null;
}
}
方法得定义
async onMethodCall(call: MethodCall, result: MethodResult) {
switch (call.method) {
case "requestPermission":
const atManager:abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(this.context, permissions).then((data) => {
Log.d(TAG, `requestPermissionsFromUser success, statue is ${JSON.stringify(data)}`);
const grantStatus: Array<number> = data.authResults;
const readContactsResult = 0;
const writeContactsResult = 1;
result.success(grantStatus[readContactsResult] == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED && grantStatus[writeContactsResult] == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED);
}).catch((err: BusinessError)=>{
result.success(false);
Log.e(TAG, `requestPermissionsFromUser failed, code is ${err.code}, message is ${err.message}`);
});
break;
flutter端代码
static const _channel = MethodChannel('github.com/QuisApp/flutter_contacts');
static const _eventChannel =
EventChannel('github.com/QuisApp/flutter_contacts/events');
List untypedContacts = await _channel.invokeMethod('select', [
id,
withProperties,
withThumbnail,
withPhoto,
withGroups,
withAccounts,
config.returnUnifiedContacts,
config.includeNonVisibleOnAndroid,
config.includeNotesOnIos13AndAbove,
]);
flutter example 引用
import 'package:flutter_contacts/flutter_contacts.dart';
Future _fetchContacts() async {
if (!await FlutterContacts.requestPermission(readonly: true)) {
setState(() => _permissionDenied = true);
} else {
final contacts = await FlutterContacts.getContacts();
setState(() => _contacts = contacts);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探