Flutter 颤振接触选择器

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

我在我的Flitter应用程序中使用contact_picker从手机的联系人中获取联系人。当我点击电话簿中的联系人姓名时,应用程序崩溃

代码如下:

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;
私人活动