안드로이드에서 파일을 클릭하면 연결프로그램 이라고 뜨고 어떤 앱으로 해당 파일을 열것 인지 선택할 수 있게 한다.
오늘은 나의 앱을 연결프로그램에 뜰 수 있도록 설정해보자!!
앱은 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;
}
이제 나의 앱을 연결프로그램에서도 볼 수 있다. 야호!