본문 바로가기

안드로이드

푸시 서비스 사용하기 - 메세지 전송 앱 만들기

반응형

build.gradle(Module)

dependencies {
	...
    // HTTP 라이브러리
    implementation 'com.android.volley:volley:1.2.1'
}

 

 

AndroidManifest.xml

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

    <uses-permission android:name="android.permission.INTERNET" />

    <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.A83_Push_Send">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

acitvity_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"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/editText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10"
            android:inputType="textPersonName" />

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="전송하기" />
    </LinearLayout>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/holo_blue_bright">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/textView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="20sp" />
        </LinearLayout>
    </ScrollView>
</LinearLayout>

 

 

서버 키 확인

 

 

MainActivity

package com.example.a83_push_send;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    EditText editText;
    TextView textView;

    static RequestQueue requestQueue;
    static String regId;

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

        editText = findViewById(R.id.editText);
        textView = findViewById(R.id.textView);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String input = editText.getText().toString();
                send(input);
            }
        });

        if (requestQueue == null) {
            requestQueue = Volley.newRequestQueue(getApplicationContext());
        }

    }

    public void send(String input) {
//        전송 정보를 담아둘 JSONObject 객체
        JSONObject requestData = new JSONObject();

        try {
//            옵션 추가
//            https://velog.io/@jwkim/%ED%97%A4%EC%9D%B4%EB%8F%99%EB%8F%99-05-FCM-%ED%91%B8%EC%8B%9C-%EC%95%8C%EB%A6%BC
//            이게 있어야 푸시가 제대로 뜬다고 한다
            requestData.put("priority", "high");

//            전송할 데이터 추가
            JSONObject dataObj = new JSONObject();
            dataObj.put("contents", input);
            requestData.put("data", dataObj);

//            푸시 메세지를 수신할 단말의 등록 ID를 JSONArray에 추가한 후 requestData 객체에 추가
            JSONArray idArray = new JSONArray();
            idArray.put(0, regId);
            requestData.put("registration_ids", idArray);

        } catch (Exception e) {
            e.printStackTrace();
        }

//        푸시 전송을 위해 정의한 메소드 호출
        sendData(requestData, new SendResponseListener() {
            @Override
            public void onRequestStarted() {
                println("onRequestStarted 호출");
            }

            @Override
            public void onRequestCompleted() {
                println("onRequestCompleted 호출");
            }

            @Override
            public void onRequestWithError(VolleyError error) {
                println("onRequestWithError 호출");
            }
        });
    }

    public interface SendResponseListener {
        public void onRequestStarted();

        public void onRequestCompleted();

        public void onRequestWithError(VolleyError error);
    }

    public void sendData(JSONObject requestData, final SendResponseListener listener) {
        
//        Volley 요청 객체를 만들고 요청을 위항 데이터 설정
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, "https://fcm.googleapis.com/fcm/send", requestData, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                listener.onRequestCompleted();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                listener.onRequestWithError(error);
            }
        }) {
//            JSONObjectRequest 객체를 만들 때 메소드를 재정의하면 요청 파라미터와 헤더를 설정할 수 있다

//            요청을 위한 파라미터 설정
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
//                아무런 파라미터도 설정하지 않고 비어있는 HashMap 객체만 리턴
                Map<String, String> params = new HashMap<>();
                return params;
            }

//            요청을 위한 헤더 설정
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
//                
                Map<String, String> headers = new HashMap<>();
                headers.put("Authorization", "key=서버키");

                return headers;
            }

            @Override
            public String getBodyContentType() {
                return "application/json";
            }
        };

        request.setShouldCache(false);
        listener.onRequestStarted();
        requestQueue.add(request);
    }


    public void println(String data) {
        textView.append(data + "\n");
    }
}

 

 

 

푸시 메세지를 받는 앱을 실행하면 등록 id가 뜬다

 

        FirebaseMessaging.getInstance().getToken().addOnCompleteListener(new OnCompleteListener<String>() {
            ...
                Log.d("asd", "id : " + newToken);

                println("등록 id : " + newToken);
            }
        });

 

해당 id를 로그캣에 출력시킨 후에 복사하여서 푸시 메세지를 보내는 앱의 코드에 regId를 수정한다

 

 

    ...
    static RequestQueue requestQueue;
    static String regId = "fwI7llFMRbCI0M09WEt2JK:APA91bEIWVEr8lViRtziIU5RN4AT2hCDAAFW8WRIpDZvirBlhHzg5gM3RxLbM2_c3ehxR0FJT5FX_QArxh6KTNX5pW15pR1uLqBRTAJgik0gkZMVx9MDwOIAfEFrKJ_qGrWPU291xfiz";

 

 

 

 

반응형

'안드로이드' 카테고리의 다른 글

시스템 서비스  (0) 2021.11.11
센서  (0) 2021.11.11
푸시 서비스 사용하기  (0) 2021.11.10
상단 알림으로 알려주기  (0) 2021.11.10
진동과 소리로 알려주기  (0) 2021.11.10