包导入
本文用到的package均来自官方提供的Dart packages
首先在pubspec.yaml文件中引用并自动下载
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2
contacts_service: ^0.6.3
image_picker: ^1.0.4
permission_handler: ^11.0.1
photo_manager: ^2.8.1
geolocator: ^10.1.0
安卓权限声明
获取用户授权需要在安卓的包内声明方法,
找到工程路径下android/app/src/main/AndroidManifest.xml文件
确保在标签<manifest>内,<application>外声明
<!-- 获取通讯录权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<!-- 获取存储权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 获取地理位置 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
开发使用
以获取通讯录权限为示例,
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:contacts_service/contacts_service.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: ContactListScreen(),
);
}
}
class ContactListScreen extends StatefulWidget {
@override
_ContactListScreenState createState() => _ContactListScreenState();
}
class _ContactListScreenState extends State<ContactListScreen> {
List<Contact> _contacts = [];
@override
void initState() {
super.initState();
_requestPermissions();
}
Future<void> _requestPermissions() async {
// 请求通讯录权限
var status = await Permission.contacts.request();
if (status.isGranted) {
// 权限已授予,执行获取联系人数据的操作
_getContacts();
} else {
// 用户拒绝了权限请求,你可以在这里处理相应的逻辑
print('Permission denied by user.');
}
}
Future<void> _getContacts() async {
// 获取联系人
Iterable<Contact> contacts = await ContactsService.getContacts();
setState(() {
_contacts = contacts.toList();
});
// 打印通讯录信息到控制台
for (var contact in _contacts) {
print('Name: ${contact.displayName ?? ''}');
for (var phone in contact.phones ?? []) {
print(' Phone: ${phone.value ?? ''}');
}
print('---');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Contact List'),
),
body: _contacts.isNotEmpty
? ListView.builder(
itemCount: _contacts.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(_contacts[index].displayName ?? ''),
subtitle: Text(_contacts[index].phones?.isNotEmpty == true
? _contacts[index].phones!.first.value ?? ''
: ''),
);
},
)
: Center(
child: Text('No contacts available.'),
),
);
}
}
一些解释
permission_handler提供了获取安卓权限的方法,通过直接使用该模块可以直接监听用户是否授权相应权限。该模块可以请求获取蓝牙/外设/短信/通讯录/地理位置等等权限。
contacts_service主要用来整合信息。和ListView组件联动有很棒的效果。