본문 바로가기
개발 공부 기록하기/- Android

Intent로 인스타, 유튜브, 앱리뷰 실행시키기

by soulduse 2019. 1. 2.
반응형

Intent로 인스타, 유튜브, 앱리뷰 간단히 실행시키기


앱 개발중 

- 리뷰 구걸을 위해 내앱이 등록된 플레이스토어로 이동

- 내 앱 사용 설명을 위해 내가 등록한 유튜브 페이지로 앱을 실행

- 특정인의 인스타그램으로 이동


등 다양하게 Intent를 사용할 경우가 있습니다.


위에 나열한 내용을 어떻게 구현하는지 알아봅시다.

val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
context.startActivity(intent)

핵심은 이 두줄로 가능합니다. url에다가 알맞은 값만 넣어주면 끝인데요!


결론부터 보여드리자면 코드는 아래와 같습니다.

object LaunchAppsUtil {
fun launchReview(context: Context) {
val appPackageName = context.packageName
launchApp(
context,
"market://details?id=$appPackageName",
"https://play.google.com/store/apps/details?id=$appPackageName"
)
}

fun launchInstagram(context: Context, userName: String) {
launchApp(
context,
"http://instagram.com/_u/$userName",
"http://instagram.com/$userName"
)
}

fun launchYoutube(context: Context, id: String) {
launchApp(
context,
"vnd.youtube:$id",
"http://www.youtube.com/watch?v=$id"
)
}

private fun launchApp(context: Context, firstUrl: String, secondUrl: String) {
val firstIntent = Intent(Intent.ACTION_VIEW, Uri.parse(firstUrl))
val secondIntent = Intent(Intent.ACTION_VIEW, Uri.parse(secondUrl))
try {
context.startActivity(firstIntent)
} catch (e: ActivityNotFoundException) {
context.startActivity(secondIntent)
}
}
}


어떤 원리로 동작하는 것일까요?


아래의 코드를 한번 봅시다

val intent = Intent(Intent.ACTION_VIEW, Uri.parse("http://soulduse.tistory.com"))
context.startActivity(intent)

이걸 실행하면 어떤 결과가 나올까요?


실행해보면 웹뷰에서 뭔가가 나오는게 아니라, (당연히 설정해준게 없기 때문에) 아래와 같이 연결할 프로그램이 뜨고 브라우저 리스트가 나옵니다.


val intent = Intent(Intent.ACTION_VIEW, Uri.parse("http://soulduse.tistory.com"))

브라우저 리스트가 나온다는 것은, http://는 URL로 시작되는 경우를 감지해서 앱을 실행하려고 하는 것을 알 수 있습니다.

http:// URL scheme가 설정되었다는 뜻입니다.


"http://", "ftp://", "market://"과 같은 문자열을 url scheme이라 부릅니다. url scheme을 통해 앱이 실행되는 방식은 다음과 같습니다.


- 웹페이지에서 하이퍼링크 클릭시 url scheme이 system에 전달됨.

- system에서 전달된 url scheme을 보고 실행 가능한 앱이 있는지 확인.

- 해당 url scheme을 받을 수 있는 앱이 있다면 앱을 실행시키며 이 url을 함께 전달

- 앱이 실행되면서 url에 포함된 내용을 참조해서 특정 기능을 수행함.

내용 네이버 출처


※ 웹 페이지에서 url scheme을 이용해 앱을 실행하는 경우, 앱이 미설치된 경우의 예외 처리를 구현해야 합니다.

위의 코드중 아래와 같이 예외처리.

try {
context.startActivity(firstIntent)
} catch (e: ActivityNotFoundException) {
context.startActivity(secondIntent)
}


자세히 이해를 돕기위해 두번째 간단한 프로젝트를 만들었습니다.

기본 메인액티비와 또다른 하나의 추가 액티비티를 만들었습니다.

class CustomUriSchemeActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_custom_uri_scheme)
}
}

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".CustomUriSchemeActivity">


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Custom Uri Scheme App!"
android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>

</RelativeLayout>
<activity android:name=".CustomUriSchemeActivity">
<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="hello"
android:scheme="soulduse"/>
</intent-filter>
</activity>

여기서 눈여겨야 봐야할 부분인데요, scheme 값은 soulduse, host 값은 hello로 Custom Uri Scheme을 만들었습니다.


자 그럼 다른 프로젝트에서 해당 앱을 실행시키기 위해선 아래와 같이 하면 되겠죠

fun sampleIntent(context: Context) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("soulduse://hello"))
context.startActivity(intent)
}

자 앱을 실행하면 다음과 같이 바로 Custom Uri Scheme App!이 표시되는 것을 확인할 수 있습니다.

메인 액티비티가 있음에도 불구하고 바로 CustomUriSchemeActivity가 실행된 것을 보실 수 있습니다.

※ 참고로 2개의 앱 중 A앱에서 위의 sampleIntent메소드를 실행시켰고, B앱인 CustmSchemeTest 앱이 실행되었습니다.

"vnd.youtube:$id"
"http://instagram.com/_u/$userName"
"market://details?id=$appPackageName"

그럼 위에 내용들을 봤을때 대충 어떤 내용인지 짐작이 가실껍니다.

vnd.youtube는 youtube에서 만든 custom cheme,

market://은 play store용 custom cheme,

http://instagram.com의 경우에는 host 값이 instagram.com/_u/를 가진다고 볼 수 있겠죠.

따라서 위의 값으로 Intent를 실행시키면 해당 앱이 실행되는 것을 알 수 있습니다.



참고한 내용

https://developer.android.com/guide/components/intents-filters

https://developer.android.com/training/basics/intents/sending

http://gun0912.tistory.com/13






반응형