Flutter實(shí)戰(zhàn) 插件開(kāi)發(fā):Android端API實(shí)現(xiàn)

2021-03-09 10:18 更新

本節(jié)我們接著上一節(jié)"獲取電池電量"插件的示例,來(lái)完成 Android 端 API 的實(shí)現(xiàn)。以下步驟是使用 Java 的示例,如果您更喜歡 Kotlin,可以直接跳到后面 Kotlin 部分。

首先在 Android Studio 中打開(kāi)您的Flutter應(yīng)用的Android部分:

  1. 啟動(dòng) Android Studio
  2. 選擇 File > Open…
  3. 定位到您 Flutter app 目錄, 然后選擇里面的 android文件夾,點(diǎn)擊 OK
  4. java目錄下打開(kāi) MainActivity.java

接下來(lái),在onCreate里創(chuàng)建 MethodChannel 并設(shè)置一個(gè)MethodCallHandler。確保使用和 Flutter 客戶端中使用的通道名稱相同的名稱。

  1. import io.flutter.app.FlutterActivity;
  2. import io.flutter.plugin.common.MethodCall;
  3. import io.flutter.plugin.common.MethodChannel;
  4. import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
  5. import io.flutter.plugin.common.MethodChannel.Result;
  6. public class MainActivity extends FlutterActivity {
  7. private static final String CHANNEL = "samples.flutter.io/battery";
  8. @Override
  9. public void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
  12. new MethodCallHandler() {
  13. @Override
  14. public void onMethodCall(MethodCall call, Result result) {
  15. // TODO
  16. }
  17. });
  18. }
  19. }

接下來(lái),我們添加 Java 代碼,使用 Android 電池 API 來(lái)獲取電池電量。此代碼和在原生 Android 應(yīng)用中編寫的代碼完全相同。

首先,添加需要導(dǎo)入的依賴。

  1. import android.content.ContextWrapper;
  2. import android.content.Intent;
  3. import android.content.IntentFilter;
  4. import android.os.BatteryManager;
  5. import android.os.Build.VERSION;
  6. import android.os.Build.VERSION_CODES;
  7. import android.os.Bundle;

然后,將下面的新方法添加到 activity 類中的,位于 onCreate 方法下方:

  1. private int getBatteryLevel() {
  2. int batteryLevel = -1;
  3. if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
  4. BatteryManager batteryManager = (BatteryManager) getSystemService(BATTERY_SERVICE);
  5. batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
  6. } else {
  7. Intent intent = new ContextWrapper(getApplicationContext()).
  8. registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
  9. batteryLevel = (intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100) /
  10. intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
  11. }
  12. return batteryLevel;
  13. }

最后,我們完成之前添加的onMethodCall方法。我們需要處理平臺(tái)方法名為getBatteryLevel的調(diào)用消息,所以我們需要先在 call 參數(shù)判斷調(diào)用的方法是否為getBatteryLevel。 這個(gè)平臺(tái)方法的實(shí)現(xiàn)只需調(diào)用我們?cè)谇耙徊街芯帉懙?Android 代碼,并通過(guò)result參數(shù)返回成功或錯(cuò)誤情況的響應(yīng)信息。如果調(diào)用了未定義的 API,我們也會(huì)通知返回:

  1. @Override
  2. public void onMethodCall(MethodCall call, Result result) {
  3. if (call.method.equals("getBatteryLevel")) {
  4. int batteryLevel = getBatteryLevel();
  5. if (batteryLevel != -1) {
  6. result.success(batteryLevel);
  7. } else {
  8. result.error("UNAVAILABLE", "Battery level not available.", null);
  9. }
  10. } else {
  11. result.notImplemented();
  12. }
  13. }

現(xiàn)在就可以在 Android 上運(yùn)行該應(yīng)用程序了,如果使用的是 Android 模擬器,則可以通過(guò)工具欄中的"..."按鈕訪問(wèn) Extended Controls 面板中的電池電量。

#使用Kotlin添加Android平臺(tái)特定的實(shí)現(xiàn)

使用 Kotlin 和使用 Java 的步驟類似,首先在 Android Studio 中打開(kāi)您的 Flutter 應(yīng)用的 Android 部分:

  1. 啟動(dòng) Android Studio。
  2. 選擇 the menu item "File > Open…"。
  3. 定位到 Flutter app 目錄, 然后選擇里面的 android文件夾,點(diǎn)擊 OK。
  4. kotlin目錄中打開(kāi)MainActivity.kt

接下來(lái),在onCreate里創(chuàng)建 MethodChannel 并設(shè)置一個(gè)MethodCallHandler。確保使用與在 Flutter 客戶端使用的通道名稱相同。

  1. import android.os.Bundle
  2. import io.flutter.app.FlutterActivity
  3. import io.flutter.plugin.common.MethodChannel
  4. import io.flutter.plugins.GeneratedPluginRegistrant
  5. class MainActivity() : FlutterActivity() {
  6. private val CHANNEL = "samples.flutter.io/battery"
  7. override fun onCreate(savedInstanceState: Bundle?) {
  8. super.onCreate(savedInstanceState)
  9. GeneratedPluginRegistrant.registerWith(this)
  10. MethodChannel(flutterView, CHANNEL).setMethodCallHandler { call, result ->
  11. // TODO
  12. }
  13. }
  14. }

接下來(lái),我們添加 Kotlin 代碼,使用 Android 電池 API 來(lái)獲取電池電量,這和原生開(kāi)發(fā)是一樣的。

首先,添加需要導(dǎo)入的依賴。

  1. import android.content.Context
  2. import android.content.ContextWrapper
  3. import android.content.Intent
  4. import android.content.IntentFilter
  5. import android.os.BatteryManager
  6. import android.os.Build.VERSION
  7. import android.os.Build.VERSION_CODES

然后,將下面的新方法添加到 activity 類中的,位于 onCreate 方法下方:

  1. private fun getBatteryLevel(): Int {
  2. val batteryLevel: Int
  3. if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
  4. val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
  5. batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
  6. } else {
  7. val intent = ContextWrapper(applicationContext).registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
  8. batteryLevel = intent!!.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100 / intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
  9. }
  10. return batteryLevel
  11. }

最后,我們完成之前添加的onMethodCall方法。我們需要處理平臺(tái)方法名為getBatteryLevel的調(diào)用消息,所以我們需要先在 call 參數(shù)判斷調(diào)用的方法是否為getBatteryLevel。 這個(gè)平臺(tái)方法的實(shí)現(xiàn)只需調(diào)用我們?cè)谇耙徊街芯帉懙?Android 代碼,并通過(guò) result 參數(shù)返回成功或錯(cuò)誤情況的響應(yīng)信息。如果調(diào)用了未定義的 API,我們也會(huì)通知返回:

  1. MethodChannel(flutterView, CHANNEL).setMethodCallHandler { call, result ->
  2. if (call.method == "getBatteryLevel") {
  3. val batteryLevel = getBatteryLevel()
  4. if (batteryLevel != -1) {
  5. result.success(batteryLevel)
  6. } else {
  7. result.error("UNAVAILABLE", "Battery level not available.", null)
  8. }
  9. } else {
  10. result.notImplemented()
  11. }
  12. }

您現(xiàn)在就可以在 Android 上運(yùn)行該應(yīng)用程序。如果您使用的是 Android 模擬器,則可以通過(guò)工具欄中的"..."按鈕訪問(wèn) Extended Controls 面板中的電池電量。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)