写Flutter 申请读取通话记录权限

81 阅读1分钟

写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
/** FlutterCallLogPlugin */
class FlutterCallLogPlugin : FlutterPlugin, MethodCallHandler, ActivityAware ,
        ActivityCompat.OnRequestPermissionsResultCallback {
    private val requestReadCallLog = 1 // 权限请求码
    /// The MethodChannel that will the communication between Flutter and native Android
    ///
    /// This local reference serves to register the plugin with the Flutter Engine and unregister it
    /// when the Flutter Engine is detached from the Activity
    private lateinit var channel: MethodChannel

    ///Context
    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) {
            // 检查permissions数组是否包含我们请求的权限
            if (permissions.contains(Manifest.permission.READ_CALL_LOG)) {
                if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // 权限被授予
                    pendingResult?.success(true)
                } else {
                    // 权限被拒绝
                    pendingResult?.success(false)
                }
            }
            // 清理pendingResult
            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);
  }

}