반응형

이번에 소개할 예제는 다른 앱에 데이터를 공유하는 기능입니다.

앱을 사용하시다 보면  share버튼 즉, 공유버튼을 보신적이 있으실겁니다.

이 앱의 특정 글씨나 이미지를 카톡이나, 이메일, 구글클라우드, 페이스북 등에 보내는 기능이지요.

 

다행이 안드로이드는 다른 앱을 아주 쉽게 실행주는 주는 매커니즘이 있지요.

바로 Intent 를 이용하는 방법입니다.

 

Intent를 통해 내 앱의 데이터를 전달해줄(공유해줄) 앱을 실행시키면서

추가데이터(EXTRA_DATA)로 공유할 데이터를 전달해주면

아주 손쉽게 글씨나 이미지를 공유할 수 있습니다.

 

예제는 아주 간단하게 구현하여 공유하는 기능에만 초점을 두고 소개하고자 합니다.

보통 공유한 데이터가 글씨이거나 이미지인 경우가 많기에

버튼을 2개만들어 각각 텍스트와 이미지를 공유하도록 만들어 보겠습니다.

(공유할 이미지를 디바이스에서 선택하도록 하는 버튼까지 필요하니 총 3개의 버튼이겠군요.)

 

먼저 activity_main.xml 을 아래처럼 만들어 화면을 구현하겠습니다.

 

# activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    tools:context=".MainActivity">

    <!-- 텍스트 데이터 공유 버튼   -->
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="text share"
        android:onClick="clickTextShare"/>

    
    <!-- 공유할 이미지를 선택하기 위해 사진 or 갤러리 앱을 실행하고 이미지를 선택하도록 하는 버튼   -->
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="select image"
        android:backgroundTint="@color/teal_700"
        android:onClick="clickSelect"/>
    <!-- 선택된 이미지를 보여줄 이미지뷰   -->
    <ImageView
        android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="200dp"/>

    <!-- 위에서 선택한 이미지를 다른 앱에 공유하는 버튼   -->
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Image share"
        android:onClick="clickImageShare"/>


    
    <!-- [!추가!] 혹시 공유하고자 하는 앱을 사용자가 선택했을때 어떤 앱을 선택했는지 확인하고 싶을때를 위한 버튼  -->
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="share callback"
        android:onClick="clickShareCallback"/>

</LinearLayout>

 

 화면이 만들어 졌으니 이제 관련 코드를 작성하기 위해 MainActivity.java 파일에서

아래의 코드를 작성해 보겠습니다.

지면을 통한 설명과 코드를 오가면서 보시고 이해하기 어려우실 수 있어서 가급적 코드에 대한 설명은 각 코드의 주석을 통해 소개하고자 합니다. 주석을 유의깊게 읽어보시면서 코드를 보시면 조금 더 쉽게 이해하실 수 있으실 겁니다.

 

# MainActivity.java

 

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;

import android.app.PendingIntent;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import com.bumptech.glide.Glide;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void clickTextShare(View view) {
        //Share 기능이 가능한 앱들을 선택할 수 있도록 앱 선택 sheet 보이기

        //기본 묵시적 인텐트
        Intent intent= new Intent();
        intent.setAction(Intent.ACTION_SEND);

        //share할 데이터 글씨를 택배기사(Intent)에게 넣기 - '키'값 : Intent.EXTRA_TEXT 
        intent.putExtra(Intent.EXTRA_TEXT, "Hello. i'm share data");
        //공유할 데이터의 타입을 설정
        intent.setType("text/plain"); //기본 글씨 MIME TYPE

        //ACTION_SEND 로 인한 앱들이 모두 아래쪽에 선택되도록 나열됨. [ex. 문자, Bluetooth, GMail, 카톡 등...]
        //startActivity(intent); // 근데 그냥 실행하면 선택화면 sheet모양이 안 이쁨.

        // 그래서 조금 이쁜 앱 선택자 이용하기 : Chooser Intent
        //기존 intent를 이용하여 이쁜 선택자 만들기
        intent.putExtra(Intent.EXTRA_TITLE, "텍스트 공유");
        Intent chooserIntent= Intent.createChooser(intent, null); //두번째 파라미터 : 선택자[Chooser Sheet] 제목 글씨 [근데 안보임(저 위 intent에 Extra로 EXTRA_TITLE 넣어야 함.)- 그래서 그냥 null]
        startActivity(chooserIntent);
    }

    //공유할 파일의 Uri - 이미지 선택하여 공유하기
    Uri imgUri;

    public void clickSelect(View view) {
        Intent intent= new Intent(Intent.ACTION_PICK).setType("image/*");
        
        //api 30이상 버전부터 startActivityForResult()가  deprecated 되어서 새로 나온 [결과를 받기 위한 액티비티 실행] 클래스인 ActivityResultLauncher 를 통해 선택된 사진의 uri를 받아오기  
        resultLauncher.launch(intent);
    }

    //[결과를 받기 위한 액티비티 실행 : ActivityResultLauncher] 객체를 생성하면서 액티비티에 등록 
    ActivityResultLauncher<Intent> resultLauncher= registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
        @Override
        public void onActivityResult(ActivityResult result) {
            //실행된 사진앱 or 갤러리앱에서 사진을 올바르게 선택하고 돌아왔는가?
            if(result.getResultCode()==RESULT_OK){
                //선택된 이미지의 경로인 uri 데이터 얻어오기
                imgUri= result.getData().getData(); 
                //이미지로드 라이브러리인 Glide 를 이용하여 이미지뷰에 보이기
                Glide.with(MainActivity.this).load(imgUri).into( (ImageView)findViewById(R.id.iv) );
            }
        }
    });


    public void clickImageShare(View view) {
        //이미지 같은 바이너리 데이터 공유하기
        
        //선택된 이미지가 없으면 공유할 데이터가 없으므로.. 확인하는 코드
        if(imgUri==null) {
            Toast.makeText(this, "공유할 이미지를 먼저 선택하세요.", Toast.LENGTH_SHORT).show();
            return;
        }

        //공유가 가능한 앱들을 실행하는 Action값을 가진 묵시적 Intent객체 생성
        Intent intent= new Intent(Intent.ACTION_SEND);
        intent.putExtra(Intent.EXTRA_TITLE, "이미지 공유"); //chooser Sheet의 제목글씨
        intent.putExtra(Intent.EXTRA_TEXT, "선택된 이미지를 공유합니다."); //chooser Sheet의 텍스트글씨

        //share할 데이터인 이미지의 경로 uri를 택배기사(Intent)에게 넣기 - '키'값 : Intent.EXTRA_STREAM 
        intent.putExtra(Intent.EXTRA_STREAM, imgUri);
        intent.setType("image/*");

        startActivity(  Intent.createChooser(intent, null)  );
    }

    
    
    //[!추가!] 혹시 공유하고자 하는 앱을 사용자가 선택했을때 어떤 앱을 선택했는지 확인하고 싶을때를 위한 코드
    public void clickShareCallback(View view) {
        //공유할 앱을 선택했을때 어떤 앱을 선택했는지 확인하기... [ LOLLIPOP_MR1 api22 버전 이상에서 가능]

        Intent intent= new Intent(Intent.ACTION_SEND);
        intent.putExtra(Intent.EXTRA_TEXT, "Nice to meet you.");
        intent.setType("text/palin");

        //선택결과를 방송을 듣는 리시버 객체 생성 - 이 .java문서와 별도로 BroadcastReceiver클래스를 상속하는 클래스를 ShareChooserBroadcastReceiver.java 문서에 작성
        Intent receiverIntent= new Intent(this, ShareChooserBroadcastReceiver.class);
        PendingIntent pendingIntent= PendingIntent.getBroadcast(this, 100, receiverIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP_MR1){
            Intent chooserIntent= Intent.createChooser(intent, null, pendingIntent.getIntentSender());
            startActivity(chooserIntent);
        }else{
            Toast.makeText(this, "앱선택 리시버 등록 못함", Toast.LENGTH_SHORT).show();
            startActivity(  Intent.createChooser(intent, null)  );
        }

    }

}

 

마지막 버튼 클릭 콜백메소드인 clickShareCallback()은 필수로 구현하는 내용이 아니라

추가적으로 소개해드린 내용이니 우선 기본 텍스트와 이미지 공유만 먼저 작성해서 테스트해보시고

추가로 사용자가 선택한 공유앱이 무엇이지 알아야만 하는 특별한 상황이 있다면 추가로 구현해 보시기 바랍니다.

 

이 예제는 단순하고 다른 앱에 데이터를 공유하는 아주 기본적인 코드만 소개한 것이니

이 코드를 기반으로 응용하여 본인이 원하는 기능을 앱에 구현해보시기 바랍니다.

 

※이 포스트는 아직 완성이 아닙니다. 실행사진과 리시버클래스파일코드 등 추가로 더 작성될 예정이니 참고바랍니다.

반응형

+ Recent posts