๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿš€ Development/Android

[Android] ์•ˆ๋“œ๋กœ์ด๋“œ ํ”Œ๋ ˆ์ด์Šคํ† ์–ด ์ธ์•ฑ๋ฆฌ๋ทฐ(In-App Review) ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• (Kotlin, Java ์ฝ”๋“œ ํฌํ•จ)

by Jay Din 2024. 1. 6.
728x90
๋ฐ˜์‘ํ˜•

์ธ์•ฑ๋ฆฌ๋ทฐ(In-App Review) ๋ž€?

https://developer.android.com/guide/playcore/in-app-review?hl=ko

์ธ์•ฑ ๋ฆฌ๋ทฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ ๋‚ด์—์„œ ์ง์ ‘ ์•ฑ์— ๋Œ€ํ•œ ํ‰๊ฐ€๋‚˜ ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

Android์—์„œ๋Š” Google Play In-App Review API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ธ์•ฑ ๋ฆฌ๋ทฐ ๊ฐœ๋ฐœ ์ฝ”๋“œ

1. Google Play ์„œ๋น„์Šค API ์ถ”๊ฐ€

build.gradle ํŒŒ์ผ์— ๋‹ค์Œ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

// ์ด ์ข…์†์„ฑ์€ Google์˜ Maven ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
// ๋”ฐ๋ผ์„œ ํ”„๋กœ์ ํŠธ์˜ build.gradle ํŒŒ์ผ์— ํ•ด๋‹น ์ €์žฅ์†Œ๋„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
implementation 'com.google.android.play:review:2.0.1'

// Kotlin ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ Play In-App Review๋ฅผ ์œ„ํ•œ Kotlin ํ™•์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:
implementation 'com.google.android.play:review-ktx:2.0.1'

2-1. In-App Review ์ดˆ๊ธฐํ™” ๋ฐ ํ˜ธ์ถœ (Kotlin ver.)

import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import com.google.android.play.core.review.ReviewManagerFactory
import com.google.android.play.core.tasks.Task

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
		
        // ๋ฆฌ๋ทฐ ์‹คํ–‰ํ•  ๋ฒ„ํŠผ
        val reviewButton: Button = findViewById(R.id.reviewButton)
        reviewButton.setOnClickListener {
        	// ๋ฆฌ๋ทฐ ํ˜ธ์ถœ ํ•จ์ˆ˜
            requestInAppReview()
        }
    }

    private fun requestInAppReview() {
        val reviewManager = ReviewManagerFactory.create(this)
        val request = reviewManager.requestReviewFlow()

        request.addOnCompleteListener { task ->
            if (task.isSuccessful) {
                // ๋ฆฌ๋ทฐ ์ •๋ณด๋ฅผ ์–ป์Œ
                val reviewInfo = task.result

                // ๋ฆฌ๋ทฐ ๋‹ค์ด์–ผ๋กœ๊ทธ ํ‘œ์‹œ
                val flow = reviewManager.launchReviewFlow(this, reviewInfo)
                flow.addOnCompleteListener { reviewFlowTask ->
                    // ๋ฆฌ๋ทฐ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ œ์ถœ๋˜์—ˆ๊ฑฐ๋‚˜ ์‹คํŒจํ•œ ํ›„ ์‹คํ–‰ํ•  ์ฝ”๋“œ
                }
            } else {
                // ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ–ˆ๊ฑฐ๋‚˜ ๋ฆฌ๋ทฐ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
            }
        }
    }
}

2-2. In-App Review ์ดˆ๊ธฐํ™” ๋ฐ ํ˜ธ์ถœ (Java ver.)

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.play.core.review.ReviewInfo;
import com.google.android.play.core.review.ReviewManager;
import com.google.android.play.core.review.ReviewManagerFactory;
import com.google.android.play.core.tasks.Task;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
		
        // ๋ฆฌ๋ทฐ ์‹คํ–‰ํ•  ๋ฒ„ํŠผ
        Button reviewButton = findViewById(R.id.reviewButton);
        reviewButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            	//๋ฆฌ๋ทฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ
                requestInAppReview();
            }
        });
    }

    private void requestInAppReview() {
        ReviewManager reviewManager = ReviewManagerFactory.create(this);
        Task<ReviewInfo> request = reviewManager.requestReviewFlow();

        request.addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                // ๋ฆฌ๋ทฐ ์ •๋ณด๋ฅผ ์–ป์Œ
                ReviewInfo reviewInfo = task.getResult();

                // ๋ฆฌ๋ทฐ ๋‹ค์ด์–ผ๋กœ๊ทธ ํ‘œ์‹œ
                Task<Void> flow = reviewManager.launchReviewFlow(MainActivity.this, reviewInfo);
                flow.addOnCompleteListener(reviewFlowTask -> {
                    // ๋ฆฌ๋ทฐ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ œ์ถœ๋˜์—ˆ๊ฑฐ๋‚˜ ์‹คํŒจํ•œ ํ›„ ์‹คํ–‰ํ•  ์ฝ”๋“œ
                });
            } else {
                // ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ–ˆ๊ฑฐ๋‚˜ ๋ฆฌ๋ทฐ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
            }
        });
    }
}

 

728x90
๋ฐ˜์‘ํ˜•