写Flutter 申请读取通话记录权限的坑
package com.phone.flutter_call_log_plugin
import android.Manifest
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.embedding.engine.plugins.activity.ActivityAware
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
import android.app.Activity
import android.content.pm.PackageManager
import android.net.Uri
import android.provider.CallLog
import com.google.gson.Gson
import androidx.annotation.NonNull
import androidx.core.content.ContextCompat
import androidx.core.app.ActivityCompat
import io.flutter.plugin.common.MethodChannel.Result
class FlutterCallLogPlugin : FlutterPlugin, MethodCallHandler, ActivityAware ,
ActivityCompat.OnRequestPermissionsResultCallback {
private val requestReadCallLog = 1
private lateinit var channel: MethodChannel
private lateinit var activity: Activity
private var pendingResult: Result? = null
override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
channel = MethodChannel(flutterPluginBinding.binaryMessenger, "flutter_call_log_plugin")
channel.setMethodCallHandler(this)
}
override fun onMethodCall(call: MethodCall, result: Result) {
if (call.method == "requestCallLogPermission"){
requestCallLogPermission(result)
}else {
result.notImplemented()
}
}
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding{
channel.setMethodCallHandler(null)
}
override fun onAttachedToActivity(binding: ActivityPluginBinding) {
activity = binding.activity
}
override fun onDetachedFromActivityForConfigChanges() {
this.onDetachedFromActivity()
}
override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
this.onAttachedToActivity(binding)
}
override fun onDetachedFromActivity() {
}
private fun requestCallLogPermission(result: Result) {
if (ContextCompat.checkSelfPermission(
activity,
Manifest.permission.READ_CALL_LOG
) != PackageManager.PERMISSION_GRANTED
) {
pendingResult = result
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.READ_CALL_LOG),
requestReadCallLog
)
} else {
result.success(true)
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
@NonNull permissions: Array<out String>,
@NonNull grantResults: IntArray
) {
if (requestCode == requestReadCallLog) {
if (permissions.contains(Manifest.permission.READ_CALL_LOG)) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
pendingResult?.success(true)
} else {
pendingResult?.success(false)
}
}
pendingResult = null
}
}
}
调用插件回调
package com.example.flutter_call_log_plugin_example
import io.flutter.embedding.android.FlutterActivity
import com.phone.flutter_call_log_plugin.FlutterCallLogPlugin
import android.os.Bundle
class MainActivity: FlutterActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode,permissions,grantResults)
var flutterCallLogPlugin = flutterEngine?.plugins?.get(FlutterCallLogPlugin::class.java) as FlutterCallLogPlugin
if (flutterCallLogPlugin!=null) {
flutterCallLogPlugin.onRequestPermissionsResult(requestCode,permissions,grantResults)
}
}
}
dart 调用
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class FlutterCallLogPlugin {
static const MethodChannel methodChannel =
MethodChannel('flutter_call_log_plugin');
static Future<bool> requestCallLogPermission() async {
try {
return await methodChannel
.invokeMethod('requestCallLogPermission');
} on PlatformException catch (e) {
debugPrint(e.message);
}
return Future.value(false);
}
}