Flutter- Android intent-filter로 파일 열기 옵션에 보이도록 하기

DO Choi·2024년 1월 18일

안드로이드에서 파일을 클릭하면 연결프로그램 이라고 뜨고 어떤 앱으로 해당 파일을 열것 인지 선택할 수 있게 한다.
오늘은 나의 앱을 연결프로그램에 뜰 수 있도록 설정해보자!!

앱은 flutter로 만들어 졌기에 methodChannel로 안드로이드에서 넘어오는 file path를 받아야한다.

우선 android/app/src/AndroidManifest.xml 에 다음과 같이 인텐트 필터를 추가한다.

 <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="content" />
                <data android:scheme="file" />
                //연결할 수 있는 파일의 타입
                <data android:mimeType="video/mp4" />
                <data android:mimeType="video/mpeg" />
            </intent-filter>

그리고 file의 path가 넘어왔을 때 (연결프로그램에서 내 앱을 열었을 때) flutter와의 소통 처리를 위해 mainActivity.kt 에 작성.

class MainActivity: FlutterActivity() {
    //flutter 와 methodchannel 연동
    private val CHANNEL = "open_file"
    var openPath: String? = null
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        Log.d("ko", "configureFlutterEngine");
        GeneratedPluginRegistrant.registerWith(flutterEngine)
        val channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
        channel.setMethodCallHandler { call, result ->
            when (call.method) {
                //getOpenFileUrl로 flutter에게 path 보내기
                "getOpenFileUrl" -> {
                    result.success(openPath)
                    openPath = null
                }
                else -> result.notImplemented()
            }
        }
    }
    //시작시에
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        handleOpenFileUrl(intent)
    }
    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        handleOpenFileUrl(intent)
    }

    //파일에서 넘어올 때 Intent를 사용하여 파일path를 받아옴
    private fun handleOpenFileUrl(intent: Intent?) {
        val path = intent?.data?.path
        if (path != null) {
            //path가 null이 아니면 설정
            openPath = path
        }
    }
}

그리고 flutter에서 해당 파일을 열 수 있도록 처리를 해야하기때문에 main.dart를 수정한다.
그 후 넘어온 path를 가지고 file을 본인 생각대로 처리해주면 된다!


    dynamic url = await platform.invokeMethod("getOpenFileUrl");
    //url이 정상적으로 들어온 경우
    if (url != null) {
        debugPrint(url);
        return true;
    }else{
      debugPrint("no path");
      openFilePath = "";
      debugPrint(openFilePath);
     
      return false;
    }

이제 나의 앱을 연결프로그램에서도 볼 수 있다. 야호!

profile
Flutter / Android

0개의 댓글