반응형
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 |