Flutter 颤振接触选择器
我在我的Flitter应用程序中使用contact_picker从手机的联系人中获取联系人。当我点击电话簿中的联系人姓名时,应用程序崩溃 代码如下:Flutter 颤振接触选择器,flutter,Flutter,我在我的Flitter应用程序中使用contact_picker从手机的联系人中获取联系人。当我点击电话簿中的联系人姓名时,应用程序崩溃 代码如下: import 'package:flutter/material.dart'; import 'package:contact_picker/contact_picker.dart'; void main() { runApp(new MyApp()); } class MyApp extends StatefulWidget { @o
import 'package:flutter/material.dart';
import 'package:contact_picker/contact_picker.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
final ContactPicker _contactPicker = new ContactPicker();
Contact _contact;
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new Scaffold(
appBar: new AppBar(
title: new Text('Plugin example app'),
),
body: new Center(
child: new Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
new MaterialButton(
color: Colors.blue,
child: new Text("CLICK ME"),
onPressed: () async {
Contact contact = await _contactPicker.selectContact();
setState(() {
_contact = contact;
});
},
),
new Text(
_contact == null ? 'No contact selected.' : _contact.toString(),
),
],
),
),
),
);
}
}
知道为什么会这样吗?
我正在使用contact_picker 0.0.2
电话簿显示,但单击联系人后,应用程序崩溃。您需要编辑以下文件C:\your pub cache directory\contact\u picker-0.0.1+2\android\src\main\java\net\goderbauer\flatter\contactpicker\ContactPickerPlugin.java,并替换为以下代码
// Copyright 2017 Michael Goderbauer. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package net.goderbauer.flutter.contactpicker;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import java.util.HashMap;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.Registrar;
import static android.app.Activity.RESULT_OK;
public class ContactPickerPlugin implements MethodCallHandler, PluginRegistry.ActivityResultListener {
public static void registerWith(Registrar registrar) {
final MethodChannel channel = new MethodChannel(registrar.messenger(), "contact_picker");
ContactPickerPlugin instance = new ContactPickerPlugin(registrar.activity());
registrar.addActivityResultListener(instance);
channel.setMethodCallHandler(instance);
}
private ContactPickerPlugin(Activity activity) {
this.activity = activity;
}
private static int PICK_CONTACT = 2015;
private Activity activity;
private Result pendingResult = null;
@Override
public void onMethodCall(MethodCall call, Result result) {
if (call.method.equals("selectContact")) {
if (pendingResult != null) {
pendingResult.error("multiple_requests", "Cancelled by a second request.", null);
pendingResult = null;
}
pendingResult = result;
Intent i = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
activity.startActivityForResult(i, PICK_CONTACT);
} else {
//result.notImplemented();
pendingResult = null;
}
}
@Override
public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != PICK_CONTACT) {
return false;
}
if (resultCode != RESULT_OK) {
pendingResult.success(null);
pendingResult = null;
}
if(pendingResult != null){
Uri contactUri = data.getData();
Cursor cursor = activity.getContentResolver().query(contactUri, null, null, null, null);
cursor.moveToFirst();
int phoneType = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
String customLabel = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.LABEL));
String label = (String) ContactsContract.CommonDataKinds.Email.getTypeLabel(activity.getResources(), phoneType, customLabel);
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String fullName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
HashMap phoneNumber = new HashMap();
phoneNumber.put("number", number);
phoneNumber.put("label", label);
HashMap contact = new HashMap();
contact.put("fullName", fullName);
contact.put("phoneNumber", phoneNumber);
pendingResult.success(contact);
pendingResult = null;
return true;
}
else{
pendingResult = null;
return false;
}
}
}
//2017年迈克尔·戈德鲍尔版权所有。版权所有。
//此源代码的使用受BSD样式许可证的约束,该许可证可以
//在许可证文件中找到。
包net.goderbauer.flatter.contactpicker;
导入android.app.Activity;
导入android.content.Intent;
导入android.database.Cursor;
导入android.net.Uri;
导入android.provider.contacts合同;
导入java.util.HashMap;
导入io.flatter.plugin.common.MethodChannel;
导入io.flatter.plugin.common.MethodChannel.MethodCallHandler;
导入io.flatter.plugin.common.MethodChannel.Result;
导入io.flatter.plugin.common.MethodCall;
导入io.flatter.plugin.common.PluginRegistry;
导入io.flatter.plugin.common.PluginRegistry.register;
导入静态android.app.Activity.RESULT\u确定;
公共类ContactPickerPlugin实现MethodCallHandler,PluginRegistry.ActivityResultListener{
公共静态无效登记员(登记员){
最终方法通道=新方法通道(registrator.messenger(),“contact_picker”);
ContactPickerPlugin实例=新建ContactPickerPlugin(register.activity());
registrator.addActivityResultListener(实例);
setMethodCallHandler(实例);
}
私人联系人PickerPlugin(活动){
这个。活动=活动;
}
专用静态int PICK_CONTACT=2015;
私人活动;
私有结果pendingreult=null;
@凌驾
MethodCall上的公共无效(MethodCall调用,结果){
if(call.method.equals(“selectContact”)){
如果(Pendingreult!=null){
Pendingreult.error(“多个_请求”,“被第二个请求取消”,null);
pendingreult=null;
}
Pendingreult=结果;
意向i=新意向(Intent.ACTION\u PICK,contacts contract.commonDataTypes.Phone.CONTENT\u URI);
活动。startActivityForResult(i,选择联系人);
}否则{
//result.notImplemented();
pendingreult=null;
}
}
@凌驾
公共布尔onActivityResult(int请求代码、int结果代码、意图数据){
如果(请求代码!=选择联系人){
返回false;
}
if(resultCode!=结果\u确定){
pendingreult.success(空);
pendingreult=null;
}
如果(Pendingreult!=null){
Uri contactUri=data.getData();
Cursor Cursor=activity.getContentResolver().query(contactUri,null,null,null);
cursor.moveToFirst();
int phoneType=cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataTypes.Phone.TYPE));
String customLabel=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataTypes.Phone.LABEL));
字符串标签=(字符串)ContactsContract.CommonDataTypes.Email.getTypeLabel(activity.getResources(),phoneType,customLabel);
String number=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataTypes.Phone.number));
String fullName=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataTypes.Phone.DISPLAY_NAME));
HashMap phoneNumber=新的HashMap();
电话号码。输入(“号码”,数字);
电话号码。放置(“标签”,标签);
HashMap contact=新的HashMap();
联系人。put(“全名”,全名);
联系人。输入(“电话号码”,电话号码);
pendingreult.success(联系人);
pendingreult=null;
返回true;
}
否则{
pendingreult=null;
返回false;
}
}
}
干杯 您需要编辑以下文件C:\your pub cache directory\contact\u picker-0.0.1+2\android\src\main\java\net\goderbauer\flatter\contactpicker\ContactPickerPlugin.java并替换为以下代码
// Copyright 2017 Michael Goderbauer. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package net.goderbauer.flutter.contactpicker;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import java.util.HashMap;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.Registrar;
import static android.app.Activity.RESULT_OK;
public class ContactPickerPlugin implements MethodCallHandler, PluginRegistry.ActivityResultListener {
public static void registerWith(Registrar registrar) {
final MethodChannel channel = new MethodChannel(registrar.messenger(), "contact_picker");
ContactPickerPlugin instance = new ContactPickerPlugin(registrar.activity());
registrar.addActivityResultListener(instance);
channel.setMethodCallHandler(instance);
}
private ContactPickerPlugin(Activity activity) {
this.activity = activity;
}
private static int PICK_CONTACT = 2015;
private Activity activity;
private Result pendingResult = null;
@Override
public void onMethodCall(MethodCall call, Result result) {
if (call.method.equals("selectContact")) {
if (pendingResult != null) {
pendingResult.error("multiple_requests", "Cancelled by a second request.", null);
pendingResult = null;
}
pendingResult = result;
Intent i = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
activity.startActivityForResult(i, PICK_CONTACT);
} else {
//result.notImplemented();
pendingResult = null;
}
}
@Override
public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != PICK_CONTACT) {
return false;
}
if (resultCode != RESULT_OK) {
pendingResult.success(null);
pendingResult = null;
}
if(pendingResult != null){
Uri contactUri = data.getData();
Cursor cursor = activity.getContentResolver().query(contactUri, null, null, null, null);
cursor.moveToFirst();
int phoneType = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
String customLabel = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.LABEL));
String label = (String) ContactsContract.CommonDataKinds.Email.getTypeLabel(activity.getResources(), phoneType, customLabel);
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String fullName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
HashMap phoneNumber = new HashMap();
phoneNumber.put("number", number);
phoneNumber.put("label", label);
HashMap contact = new HashMap();
contact.put("fullName", fullName);
contact.put("phoneNumber", phoneNumber);
pendingResult.success(contact);
pendingResult = null;
return true;
}
else{
pendingResult = null;
return false;
}
}
}
//2017年迈克尔·戈德鲍尔版权所有。版权所有。
//此源代码的使用受BSD样式许可证的约束,该许可证可以
//在许可证文件中找到。
包net.goderbauer.flatter.contactpicker;
导入android.app.Activity;
导入android.content.Intent;
导入android.database.Cursor;
导入android.net.Uri;
导入android.provider.contacts合同;
导入java.util.HashMap;
导入io.flatter.plugin.common.MethodChannel;
导入io.flatter.plugin.common.MethodChannel.MethodCallHandler;
导入io.flatter.plugin.common.MethodChannel.Result;
导入io.flatter.plugin.common.MethodCall;
导入io.flatter.plugin.common.PluginRegistry;
导入io.flatter.plugin.common.PluginRegistry.register;
导入静态android.app.Activity.RESULT\u确定;
公共类ContactPickerPlugin实现MethodCallHandler,PluginRegistry.ActivityResultListener{
公共静态无效登记员(登记员){
最终方法通道=新方法通道(registrator.messenger(),“contact_picker”);
ContactPickerPlugin实例=新建ContactPickerPlugin(register.activity());
registrator.addActivityResultListener(实例);
setMethodCallHandler(实例);
}
私人联系人PickerPlugin(活动){
这个。活动=活动;
}
专用静态int PICK_CONTACT=2015;
私人活动