IT/안드로이드+JAVA

[안드로이드] 타 앱 호출하기 (Custom URL Scheme)

안경 쓴 귀니 2020. 10. 25. 01:56
반응형

 

타 앱을 호출하는 방법 중 Custom URL Scheme 방식으로 호출하는 방법을 설명한다.

타 앱을 호출하는 앱을 Caller 앱, 호출되는 앱을 Callee 앱이라 한다.

 

 

1. Caller 앱

 

Caller 앱은 Callee 앱을 실행하며 데이터를 전달한다.

데이터 전달 받식은 scheme://host?query 형식이다.

 

  • 테스크를 생성하지 않고 Callee 앱 호출
    아래 코드로 앱을 호출하면 Caller 앱 내에서 Callee 앱을 호출한다. (Callee 앱의 테스크는 생성되지 않음)
    앱 호출 후 메뉴 버튼을 눌러 앱 목록을 확인하면 Caller 앱만 존재한다.
1
2
3
4
5
6
7
String urlScheme ="callee://data?key1=value1&key2=value2";
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setData(Uri.parse(urlScheme));
startActivity(intent);
cs

 

  • 테스크를 생성하며 Callee 앱 호출
    아래 코드로 앱을 호출하면 Caller 앱과 별개로 Callee 앱의 테스크를 생성하며 호출한다.
    앱 호출 후 메뉴 버튼을 눌러 앱 목록을 확인하면 Caller, Callee 앱이 모두 존재한다.

    * addFlags 확인
1
2
3
4
5
6
7
8
9
String urlScheme ="callee://data?key1=value1&key2=value2";
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse(urlScheme));
startActivity(intent);
cs

 

 

 

2. Callee 앱

 

Callee 앱은 Caller 앱에서 앱을 실행할 수 있게 scheme, host를 정의하며 전달받은 데이터를 조회한다.

 

  • AndroidManifest.xml에서 scheme, host 정의
    실행시킬 Activity에 scheme://host 형태의 URL 정의 
    아래 예시에서 scheme은 callee, host는 data이며 호출 시 callee://data 형식으로 사용한다.

    * 실행시킬 Activity에 android.intent.action.MAIN, android.intent.category.LAUNCHER가 정의된 <intent-filter>가 존재할 경우, 존재하는 <intent-filter>에 아래 내용을 추가하면 안되고 별개의 <intent-filter>에 아래 내용을 추가해야한다.
1
2
3
4
5
6
7
8
<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:host="data"
        android:scheme="callee"/>
</intent-filter>
cs

 

  • 전달받은 데이터 조회
    전달받은 Custom URL Scheme 및 값 조회
    ACTION_VIEW Action을 조회한 후 Uri 및 파라미터 조회
1
2
3
4
5
6
7
8
9
10
11
12
Intent intent = getIntent();
if (Intent.ACTION_VIEW.equals(intent.getAction())) {    // Action 확인
    Uri uri = intent.getData(); // Uri 조회
    if (uri != null) {
        String getUri = uri.toString();
        String key1 = uri.getQueryParameter("key1");    // key1 값 조회
        String key2 = uri.getQueryParameter("key2");    // key2 값 조회
        Log.d(TAG, "getUri : " + getUri);  // callee://data?key1=value1&key2=value2
        Log.d(TAG, "key1 : " + key1);     // value1
        Log.d(TAG, "key2 : " + key2);     // value2
    }
}
cs

 

 

  • Callee 앱에서 데이터 전달받은 후에, 다시 앱 실행한 경우에 전달받은 데이터가 없음에도 getIntent로 값이 조회되는 문제는 아래 링크 참고
    es1015.tistory.com/348?category=683882
 

[안드로이드] getIntent 데이터 삭제하기

A앱에서 Intent로 값을 전달하며 B앱을 오픈한 경우, B앱을 종료한 후에 앱 목록에서 B앱을 선택해 다시 실행시키면 getIntent에 전달받은 값이 그대로 있는 문제가 발생한다. 테스트 순서 1. A앱에서 I

es1015.tistory.com

 

반응형