harmony_flutter_contacts(获取原生通讯录)

HarmonyOS next之harmony_flutter_contacts(获取原生通讯录)

1. ohos端建立通道

  • 请求权限方法
  • 调用系统通讯录
  • 增加增删改查
const permissions: Array<Permissions> = ['ohos.permission.READ_CONTACTS','ohos.permission.WRITE_CONTACTS']

/** FlutterContactsPlugin **/
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);
    }
  }
posted @   lsx321  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示