[Android] 다른 앱에서 데이터 받기

이번 프로젝트에서

YouTube 영상에서 앱으로 공유하여 url 과 기타정보를 가져와서 데이터를 화면에 뿌리는 작업을 수행하게되었는데

다른 앱에서 내 앱으로 공유하여 데이터를 받아오는 것은 처음이었기 때문에 삽질을 많이했다.
배껴온 자바코드가 코틀린으로 변환이 안되서 일일히 수정해보다가 접기도 하고...

공식문서와 블로그 글을 참고해서 코드를 작성해보았다.

우선 Manifest는 다음과 같다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.kenshi.sharedataexample">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.ShareDataExample">
        <activity
            android:name=".TempActivity"
            android:exported="true" >

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                <data android:mimeType="text/plain"/>
            </intent-filter>

        </activity>
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />

                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain"/>
            </intent-filter>
        </activity>
    </application>
    
</manifest>

내 앱으로 공유하였을 때 진입화면에는

<intent-filter>
    <action android:name="android.intent.action.SEND" />

    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="text/plain"/>
</intent-filter>

해당 인텐트 필터를 선언해주어야 하고,
당연히 시작 화면이 필요하니 시작화면에는 Launcher를 달아줘야한다.

MainActivity.kt 코드는 다음과 같다.

class MainActivity : AppCompatActivity() {

    lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val intent = intent
        val action = intent.action
        val type = intent.type

        if(Intent.ACTION_SEND == action && type != null) {
            if("text/plain" == type) {
                val sharedText = intent.getStringExtra(Intent.EXTRA_TEXT)
                Log.d("sharedText", "$sharedText")
                binding.tvSharedText.text = sharedText
            }
            else if (type.startsWith("image/")) {
                val imageUri = intent.getParcelableExtra<Uri>(Intent.EXTRA_STREAM)
                Log.d("imageUri", "$imageUri")
            }
        }
    }
}

최대한 간단하게 데이터를 text의 형태로 받아와서 해당 텍스트를 textView의 text로 넣어보았다.

유튜브 화면

공유 (ShareDataExample)

결과

이제 해당 url (동영상의 key 값) 을 이용해 YouTube Data API 를 사용하여 retrofit을 통해 썸네일과 Title(노래제목) 등을 response로 받아보도록 하겠다.

어렵다 생각하지 말고 과정을 잘게 나누고 하나씩 해결하자 Divide & Conquer

참고

데이터 다른 앱에 전달
https://developer.android.com/training/sharing/send?hl=ko

데이터 다른 앱에서 받아오기
https://developer.android.com/training/sharing/receive?hl=ko

https://soo84.tistory.com/entry/android%EB%8B%A4%EB%A5%B8-%EC%95%B1%EC%97%90%EC%84%9C-%EC%BB%A8%ED%85%90%EC%B8%A0-%EA%B3%B5%EC%9C%A0-%EC%8B%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B0%9B%EA%B8%B0-%EA%B3%B5%EC%9C%A0-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EB%AA%A9%EB%A1%9D%EC%97%90-%EC%95%B1-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0

좋은 웹페이지 즐겨찾기