From 4295a011d31bc6335223f2c820c2e0aa5ae68785 Mon Sep 17 00:00:00 2001 From: Ming Ming Date: Mon, 23 May 2022 22:18:51 +0800 Subject: [PATCH] Dump system logcat --- .../nc_photos/plugin/LogcatChannelHandler.kt | 32 +++++++++++++++++++ .../nkming/nc_photos/plugin/NcPhotosPlugin.kt | 9 ++++++ plugin/lib/nc_photos_plugin.dart | 1 + plugin/lib/src/logcat.dart | 12 +++++++ 4 files changed, 54 insertions(+) create mode 100644 plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/LogcatChannelHandler.kt create mode 100644 plugin/lib/src/logcat.dart diff --git a/plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/LogcatChannelHandler.kt b/plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/LogcatChannelHandler.kt new file mode 100644 index 00000000..c74c5e29 --- /dev/null +++ b/plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/LogcatChannelHandler.kt @@ -0,0 +1,32 @@ +package com.nkming.nc_photos.plugin + +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +class LogcatChannelHandler : MethodChannel.MethodCallHandler { + companion object { + const val METHOD_CHANNEL = "${K.LIB_ID}/logcat_method" + } + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when (call.method) { + "dump" -> { + try { + dump(result) + } catch (e: Throwable) { + result.error("systemException", e.toString(), null) + } + } + } + } + + private fun dump(result: MethodChannel.Result) { + val logs = StringBuilder() + val process = Runtime.getRuntime().exec("logcat -d") + process.inputStream.bufferedReader().use { + while (it.readLine()?.also(logs::appendLine) != null) { + } + } + result.success(logs.toString()) + } +} diff --git a/plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/NcPhotosPlugin.kt b/plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/NcPhotosPlugin.kt index 8008ebf2..9f21006c 100644 --- a/plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/NcPhotosPlugin.kt +++ b/plugin/android/src/main/kotlin/com/nkming/nc_photos/plugin/NcPhotosPlugin.kt @@ -98,6 +98,13 @@ class NcPhotosPlugin : FlutterPlugin, ActivityAware, PermissionChannelHandler.METHOD_CHANNEL ) permissionMethodChannel.setMethodCallHandler(permissionChannelHandler) + + val logcatChannelHandler = LogcatChannelHandler() + logcatMethodChannel = MethodChannel( + flutterPluginBinding.binaryMessenger, + LogcatChannelHandler.METHOD_CHANNEL + ) + logcatMethodChannel.setMethodCallHandler(logcatChannelHandler) } override fun onDetachedFromEngine( @@ -114,6 +121,7 @@ class NcPhotosPlugin : FlutterPlugin, ActivityAware, contentUriMethodChannel.setMethodCallHandler(null) permissionChannel.setStreamHandler(null) permissionMethodChannel.setMethodCallHandler(null) + logcatMethodChannel.setMethodCallHandler(null) } override fun onAttachedToActivity(binding: ActivityPluginBinding) { @@ -200,6 +208,7 @@ class NcPhotosPlugin : FlutterPlugin, ActivityAware, private lateinit var contentUriMethodChannel: MethodChannel private lateinit var permissionChannel: EventChannel private lateinit var permissionMethodChannel: MethodChannel + private lateinit var logcatMethodChannel: MethodChannel private lateinit var lockChannelHandler: LockChannelHandler private lateinit var mediaStoreChannelHandler: MediaStoreChannelHandler diff --git a/plugin/lib/nc_photos_plugin.dart b/plugin/lib/nc_photos_plugin.dart index acb92591..f8e101f4 100644 --- a/plugin/lib/nc_photos_plugin.dart +++ b/plugin/lib/nc_photos_plugin.dart @@ -4,6 +4,7 @@ export 'src/content_uri.dart'; export 'src/exception.dart'; export 'src/image_processor.dart'; export 'src/lock.dart'; +export 'src/logcat.dart'; export 'src/media_store.dart'; export 'src/native_event.dart'; export 'src/notification.dart'; diff --git a/plugin/lib/src/logcat.dart b/plugin/lib/src/logcat.dart new file mode 100644 index 00000000..2a7a57de --- /dev/null +++ b/plugin/lib/src/logcat.dart @@ -0,0 +1,12 @@ +import 'dart:async'; + +import 'package:flutter/services.dart'; +import 'package:nc_photos_plugin/src/k.dart' as k; + +class Logcat { + static Future dump() async { + return await _methodChannel.invokeMethod("dump"); + } + + static const _methodChannel = MethodChannel("${k.libId}/logcat_method"); +}