Kotlin:
import io.flutter.embedding.android.FlutterActivity
///
import android.util.Log
import android.media.MediaScannerConnection
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import java.io.File
import android.os.Bundle
import io.flutter.plugins.GeneratedPluginRegistrant
class MainActivity: FlutterActivity() {
// override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
// super.configureFlutterEngine(flutterEngine)
// // GeneratedPluginRegistrant.registerWith(flutterEngine) // add this line
// flutterEngine.getPlugins()
// }
val CHANNEL = "media_scanner"
///
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
///
GeneratedPluginRegistrant.registerWith(FlutterEngine(this));
///
// GeneratedPluginRegister.registerGeneratedPlugins(FlutterEngine(this));
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
.setMethodCallHandler { call, result ->
Log.d("MethodChannel", "Method called: ${call.method}")
when (call.method) {
"scanFile" -> {
val filePath = call.argument<String>("filePath")
filePath?.let {
MediaScannerConnection.scanFile(this, arrayOf(filePath), null) { _, _ ->
result.success(null)
}
} ?: result.error("INVALID_PATH", "Invalid file path", null)
}
// "scanDirectory" -> {
// try {
// val directoryPath = call.argument<String>("directoryPath")
// Log.d("MethodChannel", "Scanning directory: $directoryPath")
// directoryPath?.let {
// scanDirectory(directoryPath)
// result.success(null)
// } ?: result.error("INVALID_PATH", "Invalid directory path", null)
// } catch (e: Exception) {
// Log.e("MethodChannel", "Error scanning directory", e)
// result.error("ERROR", "Error scanning directory", e.localizedMessage)
// }
// }
else -> result.notImplemented()
}
}
}
///
// private fun scanDirectory(path: String) {
// val directory = File(path)
// val files = directory.listFiles()
// files?.forEach { file ->
// if (file.isFile) {
// MediaScannerConnection.scanFile(this, arrayOf(file.absolutePath), null, null)
// }
// }
// }
}
Dart:
class MediaScanner {
///
static const MethodChannel _channel = MethodChannel('media_scanner');
static Future<void> scanFile(String filePath) async {
await _channel.invokeMethod('scanFile', {'filePath': filePath});
}
static Future<void> scanDirectory(String directoryPath) async {
await _channel
.invokeMethod('scanDirectory', {'directoryPath': directoryPath});
}
///
}
For some reason I keep getting the error MissingPluginException(No implementation found for method scanDirectory on channel media_scanner) What am I missing here? I have tried the usual, cleaning, rebuilding etc. Didn't work.
AndroidManifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.adityanawandar.shotbycamera">
<!-- Permissions for file storage access -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION"/>
<application
android:requestLegacyExternalStorage="true"
android:label="ShotByCamera"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<service
android:name="id.flutter.flutter_background_service.BackgroundService"
android:foregroundServiceType="dataSync"
/>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>