将图像选择器和文件选择器插件添加到现有的android应用程序后无法在Flutter模块上运行

时间:2019-07-12 08:29:13

标签: flutter dart

我有flutter模块使用image-picker和file-picker插件,在flutter应用程序上它可以正常工作,但是当将flutter模块添加到现有的android系统中时,选择文件或图片时不会返回任何内容。 我创建了一个flutterview来向Android应用添加模块

我在图像选择器和文件选择器上发现了这段代码,这意味着它无法将文件返回到flutterView仅适用于FlutterActivity

public static void registerWith(PluginRegistry.Registrar registrar) {
    if (registrar.activity() == null) {
      // If a background flutter view tries to register the plugin, there will be no activity from the registrar,
      // we stop the registering process immediately because the ImagePicker requires an activity.
      return;
    }
    ImagePickerCache.setUpWithActivity(registrar.activity());

    final MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL);

    final File externalFilesDirectory =
        registrar.activity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    final ExifDataCopier exifDataCopier = new ExifDataCopier();
    final ImageResizer imageResizer = new ImageResizer(externalFilesDirectory, exifDataCopier);
    final ImagePickerDelegate delegate =
        new ImagePickerDelegate(registrar.activity(), externalFilesDirectory, imageResizer);

    registrar.addActivityResultListener(delegate);
    registrar.addRequestPermissionsResultListener(delegate);
    final ImagePickerPlugin instance = new ImagePickerPlugin(registrar, delegate);
    channel.setMethodCallHandler(instance);
  }
//---
File FlutterFgragment.java

package io.flutter.facade;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.view.FlutterView;

public class FlutterFragment extends Fragment  {
  private static final String CHANNEL = "hues.dev/getaccount"; // OTL
  public static final String ARG_ROUTE = "route";
  private String mRoute = "/";
  public  FlutterView flutterView;
    @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
      mRoute = getArguments().getString(ARG_ROUTE);
    }
  }

  @Override
  public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) {
    super.onInflate(context, attrs, savedInstanceState);
  }

  @Override
  public FlutterView onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    flutterView = Flutter.createView(getActivity(), getLifecycle(), mRoute);
    GeneratedPluginRegistrant.registerWith(flutterView.getPluginRegistry());
    return flutterView;
  }
  @Override public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (!flutterView.getPluginRegistry().onActivityResult(requestCode, resultCode, data)) {
            // The plugin registry's onActivityResult handler returns a boolean, so if the intent wasn't meant for a Flutter plugin you can handle it here
            super.onActivityResult(requestCode, resultCode, data);
        }
    }
  @Override
  public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

  }


  public void callMethodChannel(String argValue) {
    new MethodChannel((FlutterView) getView(), CHANNEL).invokeMethod("getToken", argValue);
  }
}
-----------------
//File Flutter.java

package io.flutter.facade;

import android.app.Activity;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;

import io.flutter.plugin.common.BasicMessageChannel;
import io.flutter.plugin.common.StringCodec;
import io.flutter.view.FlutterMain;
import io.flutter.view.FlutterNativeView;
import io.flutter.view.FlutterRunArguments;
import io.flutter.view.FlutterView;
import io.flutter.plugins.GeneratedPluginRegistrant;


/**
 * Main entry point for using Flutter in Android applications.
 *
 * <p><strong>Warning:</strong> This file is auto-generated by Flutter tooling.
 * DO NOT EDIT.</p>
 */
public final class Flutter {
  private Flutter() {
    // to prevent instantiation
  }

  /**
   * Initiates the Dart VM. Calling this method at an early point may help decreasing time to first
   * frame for a subsequently created {@link FlutterView}.
   *
   * @param applicationContext the application's {@link Context}
   */
  public static void startInitialization(@NonNull Context applicationContext) {
    FlutterMain.startInitialization(applicationContext);
  }

  /**
   * Creates a {@link FlutterFragment} managing a {@link FlutterView}. The optional
   * initial route string will be made available to the Dart code
   * (via {@code window.defaultRouteName}) and may be used to determine which widget
   * should be displayed in the view. The default initialRoute is "/".
   *
   * @param initialRoute an initial route {@link String}, or null
   * @return a {@link FlutterFragment}
   */
  @NonNull
  public static FlutterFragment createFragment(String initialRoute) {
    final FlutterFragment fragment = new FlutterFragment();
    final Bundle args = new Bundle();
    args.putString(FlutterFragment.ARG_ROUTE, initialRoute);
    fragment.setArguments(args);
    return fragment;
  }

  /**
   * Creates a {@link FlutterView} linked to the specified {@link Activity} and {@link Lifecycle}.
   * The optional initial route string will be made available to the Dart code (via
   * {@code window.defaultRouteName}) and may be used to determine which widget should be displayed
   * in the view. The default initialRoute is "/".
   *
   * @param activity an {@link Activity}
   * @param lifecycle a {@link Lifecycle}
   * @param initialRoute an initial route {@link String}, or null
   * @return a {@link FlutterView}
   */
  @NonNull
  public static FlutterView createView(@NonNull final Activity activity, @NonNull final Lifecycle lifecycle, final String initialRoute) {
    FlutterMain.startInitialization(activity.getApplicationContext());
    FlutterMain.ensureInitializationComplete(activity.getApplicationContext(), null);
    final FlutterNativeView nativeView = new FlutterNativeView(activity);
    final FlutterView flutterView = new FlutterView(activity, null, nativeView) {
      private final BasicMessageChannel<String> lifecycleMessages = new BasicMessageChannel<>(this, "flutter/lifecycle", StringCodec.INSTANCE);
      @Override
      public void onFirstFrame() {
        super.onFirstFrame();
        setAlpha(1.0f);
      }


      @Override
      public void onPostResume() {
        // Overriding default behavior to avoid dictating system UI via PlatformPlugin.
        lifecycleMessages.send("AppLifecycleState.resumed");
      }
    };
    if (initialRoute != null) {
      flutterView.setInitialRoute(initialRoute);
    }
    lifecycle.addObserver(new LifecycleObserver() {
      @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
      public void onCreate() {
        final FlutterRunArguments arguments = new FlutterRunArguments();
        arguments.bundlePath = FlutterMain.findAppBundlePath(activity.getApplicationContext());
        arguments.entrypoint = "main";
        flutterView.runFromBundle(arguments);

      }

      @OnLifecycleEvent(Lifecycle.Event.ON_START)
      public void onStart() {
        flutterView.onStart();
      }

      @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
      public void onResume() {
        flutterView.onPostResume();
      }

      @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
      public void onPause() {
        flutterView.onPause();
      }

      @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
      public void onStop() {
        flutterView.onStop();
      }

      @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
      public void onDestroy() {
        flutterView.destroy();
      }
    });
    flutterView.setAlpha(0.0f);
    return flutterView;
  }
}

我该如何使用flutterView插件

1 个答案:

答案 0 :(得分:0)

您需要在添加了onActivityResult的活动中添加flutterview

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        flutterView.onActivityResult(requestCode, resultCode, data);

    }