[{"data":1,"prerenderedAt":931},["ShallowReactive",2],{"news-item-\u002Fja\u002Fnews\u002Fandroid-firebase-for-beginer":3},{"id":4,"title":5,"body":6,"category":916,"created by":919,"date":920,"description":921,"extension":922,"meta":923,"navigation":924,"path":925,"sections":926,"seo":927,"stem":928,"thumbnail":929,"__hash__":930},"content_ja\u002Fja\u002Fnews\u002Fandroid-firebase-for-beginer.md","初心者のためのAndroid Firebase",{"type":7,"value":8,"toc":897},"minimark",[9,18,23,35,39,46,56,65,71,75,88,98,102,108,116,123,137,143,153,157,165,169,179,183,187,192,195,199,214,218,223,233,237,242,246,258,262,284,288,295,299,312,316,323,327,333,337,343,347,349,353,360,364,366,370,376,381,396,398,402,406,409,412,415,432,436,441,447,450,454,461,465,473,477,484,488,493,499,503,525,531,537,541,547,553,557,566,572,576,579,583,592,598,606,610,633,637,643,647,651,655,660,666,674,682,686,692,696,709,711,715,719,722,725,729,740,744,749,753,762,767,773,778,782,788,794,797,803,806,812,819,824,829,835,839,844,850,854,859,865,869,873,879,885,891],[10,11,14],"h1",{"style":12,"id":13},"text-align:center;","firebase",[15,16,17],"strong",{},"Firebase",[19,20,22],"h2",{"id":21},"ifirebaseとは","I. Firebaseとは",[24,25,26,27,34],"p",{},"Google FirebaseはGoogleのバックエンドアプリケーションで開発者がiOSやandroid、",[28,29,33],"a",{"href":30,"rel":31},"https:\u002F\u002Fsearchsoftwarequality.techtarget.com\u002Fdefinition\u002FWeb-application-Web-app",[32],"nofollow","Web apps","の開発を行うことができるサービスです。Firebaseはトラッキングやその分析、クラッシュレポートまたその修正、マーケティングの調査、アプリケーションの検証のツールとして提供されています。Firebaseはたくさんのサービスがあります。今回はin-app messaging、cloud messages、そしてreal-time databasesについてご紹介したいと思います。",[19,36,38],{"id":37},"iiアプリにfirebaseを追加する","II. アプリにFirebaseを追加する",[24,40,41,42],{},"AndroidアプリケーションにFirebaseを入れる前に、AndroidアプリケーションをFirebaseに接続するためそのプロジェクトを構築する必要があります。Firebaseコンソールにログインをします。 ",[28,43,44],{"href":44,"rel":45},"https:\u002F\u002Fconsole.firebase.google.com\u002F?hl=en",[32],[24,47,48,51,52,55],{},[15,49,50],{},"Step 1",": Firebaseにログインした後、\"",[15,53,54],{},"Create a project","\"をクリックします。",[57,58],"img",{"className":59,"alt":62,"src":63,"style":64},[60,61],"block","mx-auto","","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075255\u002FScreen-Shot-2020-02-20-at-9.31.55-AM.png","width: 100%;",[24,66,67,70],{},[15,68,69],{},"Step 2",": ここからは新しくFirebaseプロジェクトを作成するための手順です。Android iconをクリックします。 ",[57,72],{"className":73,"alt":62,"src":74,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075332\u002FScreen-Shot-2020-02-20-at-9.43.53-AM.png",[24,76,77,80,83,84,87],{},[15,78,79],{},"Step 3",[81,82],"android",{}," Manifestのpackage nameと同じものを\"",[15,85,86],{},"Android package name","\"に入力してください。",[24,89,90,95],{},[57,91],{"className":92,"alt":62,"src":93,"style":94},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075551\u002FScreen-Shot-2020-02-21-at-3.19.26-PM.png","width: 70%;",[96,97],"br",{},[57,99],{"className":100,"alt":62,"src":101,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075616\u002FScreen-Shot-2020-02-20-at-9.51.12-AM-1024x121.png",[24,103,104,107],{},[15,105,106],{},"Step 4",":  \"**google-services.json\"**をダウンロードしてください。そしてプロジェクトに追加してください。",[24,109,110,114],{},[57,111],{"className":112,"alt":62,"src":113,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075822\u002FScreen-Shot-2020-02-21-at-3.20.06-PM.png",[96,115],{},[24,117,118,119,122],{},"Viewを切り替えるために\"Project\"をクリックしてください。そうするとプロジェクトのrootディレクトリが表示されます。\"",[15,120,121],{},"google-services.json","\"ファイルを\"Project\u002F~\u002Fapp\"フォルダにおきます。",[24,124,125,130,131,133],{},[57,126],{"className":127,"alt":62,"src":128,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075857\u002FScreen-Shot-2020-02-20-at-9.56.43-AM.png","width: 50%;"," ",[96,132],{},[57,134],{"className":135,"alt":62,"src":136,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075949\u002FScreen-Shot-2020-02-20-at-9.58.50-AM.png",[24,138,139,142],{},[15,140,141],{},"Step 5",": Firebase SDKを設定します。（画像参照）",[24,144,145,148,149,152],{},[15,146,147],{},"1."," \"",[15,150,151],{},"build.gradle","\" (Project):",[57,154],{"className":155,"alt":62,"src":156,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080017\u002FScreen-Shot-2020-02-20-at-10.06.20-AM-1024x479.png",[24,158,159,148,162,164],{},[15,160,161],{},"2.",[15,163,151],{},"\" (app):",[57,166],{"className":167,"alt":62,"src":168,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080017\u002FScreen-Shot-2020-02-20-at-10.06.20-AM.png",[24,170,171,174,175,178],{},[15,172,173],{},"Step 6",": 起動させFirebaseのアプリの確認を待ちます。成功のメッセージが表示されると“",[15,176,177],{},"Continue to console","”をクリックします。",[57,180],{"className":181,"alt":62,"src":182,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080122\u002FScreen-Shot-2020-02-19-at-4.31.20-PM-31.png",[19,184,186],{"id":185},"iiiin-app-message","III. In-App Message",[188,189,191],"h3",{"id":190},"_1-紹介","1. 紹介",[24,193,194],{},"Firebase In-App Messagingは 狙ったユーザに対しアプリの主要な機能を動かすためテキストメッセージを送りユーザにアプリを起動させるように促すことができます。例えば、サブスクライバーやビデオ観賞、レベルの達成またはアイテムの購入を誘導するためユーザにin-app messageを送ります。 カードやバナー、モーダル、画像のようにカスタマイズすることができ、そしてトリガーをセットできます。そのため、一番効果があるタイミングで正確にそれを表示することができます。",[188,196,198],{"id":197},"_2-始め方","2. 始め方",[24,200,201,203,204,206,207,210,211,55],{},[15,202,50],{},": \"",[15,205,151],{},"\" (app)に “",[15,208,209],{},"implementation 'com.google.firebase:firebase-inappmessaging-display:19.0.3'","”を追加します。そして”",[15,212,213],{},"Sync Now",[57,215],{"className":216,"alt":62,"src":217,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080223\u002FScreen-Shot-2020-02-19-at-4.51.31-PM-33-1024x641.png",[24,219,220,222],{},[15,221,69],{},": Firebase instance ID (Firebaseのin-app messageのテストに使用するID)を取得します。",[224,225,230],"pre",{"className":226,"code":228,"language":229},[227],"language-text","private fun createInstanceId() {\n    FirebaseInstanceId.getInstance().instanceId.addOnCompleteListener { task ->\n        if (!task.isSuccessful) {\n            Log.w(TAG, \"getInstanceId failed\", task.exception)\n            return@addOnCompleteListener\n        }\n\n        \u002F\u002Fcreate new instance id Token\n        val msg = task.result?.id\n        Log.d(TAG, \"token: $msg\")\n    }\n}\n","text",[231,232,228],"code",{"__ignoreMap":62},[57,234],{"className":235,"alt":62,"src":236,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080253\u002FScreen-Shot-2020-02-19-at-5.01.04-PM-35-1024x417.png",[24,238,239,241],{},[15,240,79],{},":アプリを起動させ\"Logcat\" ツールを開きます。ID tokenをそこで確認することができます。",[57,243],{"className":244,"alt":62,"src":245,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080319\u002FScreen-Shot-2020-02-19-at-5.23.36-PM-51-1024x625.png",[24,247,248,250,251,254,255,178],{},[15,249,106],{},": ID tokenをコピーし, Firebase コンソール -\"",[15,252,253],{},"In-App Messaging","\"を開き, “",[15,256,257],{},"Create your first campaign",[57,259],{"className":260,"alt":62,"src":261,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080401\u002FScreen-Shot-2020-02-19-at-5.06.23-PM-41-1024x606.png",[24,263,264,266,267,270,271,274,275,278,279,283],{},[15,265,141],{},": \"",[15,268,269],{},"Message title","\" (例: Hello I'm FireBase)\"",[15,272,273],{},"Body","\" (optional), \"",[15,276,277],{},"Images","\" (ex: ",[28,280,281],{"href":281,"rel":282},"https:\u002F\u002Fcdn.pixabay.com\u002Fphoto\u002F2015\u002F10\u002F12\u002F14\u002F54\u002Fcoffee-983955_960_720.jpg",[32],")を入力します。",[57,285],{"className":286,"alt":62,"src":287,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080500\u002FScreen-Shot-2020-02-19-at-5.12.17-PM-45-1.png",[24,289,290,291,294],{},"\"",[15,292,293],{},"Button text","\"を追加します。",[57,296],{"className":297,"alt":62,"src":298,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080533\u002FScreen-Shot-2020-02-19-at-5.12.47-PM-47.png",[24,300,301,303,304,307,308,311],{},[15,302,173],{},": “",[15,305,306],{},"Test on Device","”をクリックし, \"",[15,309,310],{},"Add an instance ID","\" フィールドにID tokenをペーストします。",[57,313],{"className":314,"alt":62,"src":315,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080559\u002FScreen-Shot-2020-02-19-at-5.17.37-PM-49.png",[24,317,318,319,322],{},"Firebase In-App Messagingはクリックするとすぐに\"",[15,320,321],{},"Test","\"を送信します。それを見るためにはアプリをバックエンドへ移動し、テスト端末でアプリを再起動します。",[57,324],{"className":325,"alt":62,"src":326,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080625\u002FScreen-Shot-2020-02-19-at-5.24.22-PM-53-1024x663.png",[24,328,329,332],{},[15,330,331],{},"結果",":",[57,334],{"className":335,"alt":62,"src":336,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080648\u002FScreenshot_20200219-173204-57-768x1365.jpg",[24,338,339,342],{},[15,340,341],{},"Step 7",": テストが成功した後、続けるために\"**Next\"**をクリックします。",[57,344],{"className":345,"alt":62,"src":346,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080709\u002FScreen-Shot-2020-02-20-at-10.50.56-AM.png",[96,348],{},[57,350],{"className":351,"alt":62,"src":352,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080755\u002FScreen-Shot-2020-02-20-at-10.54.15-AM.png",[24,354,355,356,359],{},"メッセージを公開するために\"",[15,357,358],{},"Review","\"をクリックしてください。",[57,361],{"className":362,"alt":62,"src":363,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080836\u002FScreen-Shot-2020-02-20-at-10.56.19-AM.png",[96,365],{},[57,367],{"className":368,"alt":62,"src":369,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080911\u002FScreen-Shot-2020-02-20-at-10.55.31-AM-1024x663.png",[24,371,290,372,375],{},[15,373,374],{},"Publish","\"をクリックすると、アプリにメッセージが送信されます。",[24,377,378],{},[15,379,380],{},"結果:",[382,383,388,392],"div",{"className":384},[385,386,387],"flex","justify-center","gap-4",[57,389],{"className":390,"alt":62,"src":391,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080936\u002FScreenshot_20200219-173204-57-1-576x1024.jpg",[57,393],{"className":394,"alt":62,"src":395,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080953\u002FScreenshot_20200219-173801-59-576x1024.jpg",[96,397],{},[57,399],{"className":400,"alt":62,"src":401,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081013\u002FScreenshot_20200219-173901-61-576x1024.jpg",[19,403,405],{"id":404},"iv-cloud-message","IV. Cloud Message",[188,407,191],{"id":408},"_1-紹介-1",[24,410,411],{},"Firebase Cloud Messaging (FCM)は費用なしで確実にメッセージを届けるクロスプラットフォームメッセージソリューションです。FCMを使用し、メールや同期可能な他のデータでクライアントアプリケーションに知らせることができます。ユーザの再訪問やアプリの使用を継続させるプッシュ通知を送ることができます。 インスタントメッセージを使用するケースとして、メッセージはクライアントアプリに4KBまでのpayloadで送ることができる。",[188,413,198],{"id":414},"_2-始め方-1",[24,416,417,419,420,130,423,426,427,429,430,55],{},[15,418,50],{},": “",[15,421,422],{},"implementation",[15,424,425],{},"‘com.google.firebase:firebase-messaging:20.1.0’"," \"を\"",[15,428,151],{},"\" (app)に追加する。そして\"",[15,431,213],{},[57,433],{"className":434,"alt":62,"src":435,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081040\u002FScreen-Shot-2020-02-20-at-8.07.39-AM-63-1024x627.png",[24,437,438,440],{},[15,439,69],{}," : AndroidManifestファイルにfilterを追加します。",[224,442,445],{"className":443,"code":444,"language":229},[227],"\u003Cservice\n    android:name=\".java.MyFirebaseMessagingService\"\n    android:exported=\"false\">\n    \u003Cintent-filter>\n        \u003Caction android:name=\"com.google.firebase.MESSAGING_EVENT\" \u002F>\n    \u003C\u002Fintent-filter>\n\u003C\u002Fservice>\n",[231,446,444],{"__ignoreMap":62},[24,448,449],{},"MyFirebaseMessagingServiceは_FirebaseMessagingService_の拡張です。これはバックグラウンドでアプリにPush通知を受け取る以外にメッセージを扱うとき必要になります。フォアグランドでPush通知を受け取るためにはPayloadで受け取り、upstream messagesを送るなど、このサービスを使わなければならない。",[57,451],{"className":452,"alt":62,"src":453,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081111\u002FScreen-Shot-2020-02-20-at-8.13.02-AM-65-1024x625.png",[24,455,456,457,460],{},"今",[15,458,459],{},"line 23","にエラーが表示されています。これは_MyFirebaseMessagingService_ファイルがないために発生しているので、それを作ります。",[57,462],{"className":463,"alt":62,"src":464,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081137\u002FScreen-Shot-2020-02-20-at-8.16.28-AM-67.png",[24,466,467,471],{},[57,468],{"className":469,"alt":62,"src":470,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081206\u002FScreen-Shot-2020-02-20-at-8.17.14-AM-69.png",[96,472],{},[57,474],{"className":475,"alt":62,"src":476,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081227\u002FScreen-Shot-2020-02-20-at-8.17.30-AM-71-1024x183.png",[24,478,479,480],{},".java.MyFirebaseMessagingServiceから_",[481,482,483],"package",{},".MyFirebaseMessagingService_にpackage nameを変更します。",[57,485],{"className":486,"alt":62,"src":487,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081251\u002FScreen-Shot-2020-02-20-at-8.24.31-AM-77-1024x627.png",[24,489,490,492],{},[15,491,79],{}," (optional): デフォルトアイコンと色を設定します。特にPush通知で変更したくなければこのステップをスキップして良いです。",[224,494,497],{"className":495,"code":496,"language":229},[227],"\u003C!-- Set custom default icon. This is used when no icon is set for incoming notification messages.\n     See README(https:\u002F\u002Fgoo.gl\u002Fl4GJaQ) for more. -->\n\u003Cmeta-data\n    android:name=\"com.google.firebase.messaging.default_notification_icon\"\n    android:resource=\"@drawable\u002Fic_stat_ic_notification\" \u002F>\n\u003C!-- Set color used with incoming notification messages. This is used when no color is set for the incoming\n     notification message. See README(https:\u002F\u002Fgoo.gl\u002F6BKBk7) for more. -->\n\u003Cmeta-data\n    android:name=\"com.google.firebase.messaging.default_notification_color\"\n    android:resource=\"@color\u002FcolorAccent\" \u002F>\n",[231,498,496],{"__ignoreMap":62},[57,500],{"className":501,"alt":62,"src":502,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081324\u002FScreen-Shot-2020-02-20-at-8.36.41-AM-79-1024x627.png",[24,504,505,507,508,513,514,519,520,524],{},[15,506,106],{}," (Optional): Android 8.0 (API level 26)またはそれ以上から、",[28,509,512],{"href":510,"rel":511},"https:\u002F\u002Fdeveloper.android.com\u002Fguide\u002Ftopics\u002Fui\u002Fnotifiers\u002Fnotifications.html#ManageChannels",[32],"notification channels","はsupported またはrecommendedになっています。FCMは基本設定としてdefault notification channelの使用を提供しています。 もし新たにchannelを",[28,515,518],{"href":516,"rel":517},"https:\u002F\u002Fdeveloper.android.com\u002Fguide\u002Ftopics\u002Fui\u002Fnotifiers\u002Fnotifications.html#CreateChannel",[32],"作りたい","、デフォルトのchannelにしたい場合はdefault_notification_channel_idに自分のデフォルトchannelとしてpush通知channelオブジェクトを利用してください。 FCMはnotification channelが明示的にセットされない限りこの値を使用します。もっと詳しく知りたければ、",[28,521,523],{"href":510,"rel":522},[32],"Manage notification channels","を参照してください。",[24,526,527,530],{},[15,528,529],{},"res\u002Fvalues\u002Fstrings.xml","を開き、この行を追加してください。",[224,532,535],{"className":533,"code":534,"language":229},[227],"\u003Cstring name=\"default_notification_channel_id\">1\u003C\u002Fstring>\n",[231,536,534],{"__ignoreMap":62},[57,538],{"className":539,"alt":62,"src":540,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081349\u002FScreen-Shot-2020-02-20-at-8.44.38-AM-83-1024x350.png",[24,542,543,546],{},[15,544,545],{},"AndroidManifest","ファイルを開き、このコードを追加してください。",[224,548,551],{"className":549,"code":550,"language":229},[227],"\u003Cmeta-data\n    android:name=\"com.google.firebase.messaging.default_notification_channel_id\"\n    android:value=\"@string\u002Fdefault_notification_channel_id\" \u002F>\n",[231,552,550],{"__ignoreMap":62},[57,554],{"className":555,"alt":62,"src":556,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081416\u002FScreen-Shot-2020-02-20-at-8.46.55-AM-85-1024x627.png",[24,558,559,561,562,565],{},[15,560,141],{},": 現在のregistration tokenを取得するため",[15,563,564],{},"MainActivity","を開き、この機能を追加します。",[224,567,570],{"className":568,"code":569,"language":229},[227],"private fun createInstanceId() {\n    FirebaseInstanceId.getInstance().instanceId.addOnCompleteListener { task ->\n        if (!task.isSuccessful) {\n            Log.w(TAG, \"getInstanceId failed\", task.exception)\n            return@addOnCompleteListener\n        }\n\n        \u002F\u002Fget id Token\n        \u002F\u002F Get new Instance ID token\n        val token = task.result?.token\n\n        \u002F\u002F Log and toast\n        Log.d(TAG, \"token: $token\")\n        Toast.makeText(baseContext, \"token: $token\", Toast.LENGTH_SHORT).show()\n    }\n}\n",[231,571,569],{"__ignoreMap":62},[57,573],{"className":574,"alt":62,"src":575,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081446\u002FScreen-Shot-2020-02-20-at-8.56.08-AM-87-1024x626.png",[24,577,578],{},"アプリを動作させ、Firebase instance IDを取得します。",[57,580],{"className":581,"alt":62,"src":582,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081508\u002FScreenshot_20200220-125154-768x1365.jpg",[24,584,585,587,588,591],{},[15,586,173],{},": ",[15,589,590],{},"MyFirebaseMessagingService","クラスに下記のコードを追加します。",[224,593,596],{"className":594,"code":595,"language":229},[227],"class MyFirebaseMessagingService : FirebaseMessagingService() {\n    companion object {\n        private val TAG = this::class.java.simpleName\n    }\n\n    override fun onNewToken(token: String) {\n        Log.d(TAG, \"Refreshed token: $token\")\n        super.onNewToken(token)\n    }\n\n    override fun onMessageReceived(remoteMessage: RemoteMessage) {\n        super.onMessageReceived(remoteMessage)\n        Log.d(TAG, \"From: ${remoteMessage.from}\")\n\n        remoteMessage.data.isNotEmpty().let {\n        }\n\n        remoteMessage.notification?.let {\n            Log.d(TAG, \"Message Notification Body: ${it.body}\")\n            it.body?.let { body ->\n                sendNotification(body)\n            }\n        }\n    }\n\n    private fun sendNotification(messageBody: String) {\n        val intent = Intent(this, CloudMessageActivity::class.java)\n        intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP\n        val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT)\n\n        val channelId = getString(R.string.default_notification_channel_id)\n        val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)\n        val notificationBuilder = NotificationCompat.Builder(this, channelId)\n            .setSmallIcon(R.drawable.ic_notifications)\n            .setContentTitle(\"Mess Title\")\n            .setContentText(messageBody)\n            .setAutoCancel(true)\n            .setSound(defaultSoundUri)\n            .setContentIntent(pendingIntent)\n\n        val notificationManager =\n            getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            val channel = NotificationChannel(\n                channelId, \"Channel human readable title\",\n                NotificationManager.IMPORTANCE_DEFAULT\n            )\n            notificationManager.createNotificationChannel(channel)\n        }\n\n        notificationManager.notify(1, notificationBuilder.build())\n    }\n}\n",[231,597,595],{"__ignoreMap":62},[24,599,600,587,602,605],{},[15,601,341],{},[15,603,604],{},"Cloud Messaging","のテスト",[57,607],{"className":608,"alt":62,"src":609,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081528\u002FScreen-Shot-2020-02-20-at-12.47.45-PM.png",[24,611,612,615,616,619,620,622,623,626,627,632],{},[15,613,614],{},"Notification"," ",[15,617,618],{},"Title",", ",[15,621,229],{}," と ",[15,624,625],{},"image"," (optional)を入力します。 ex: ",[28,628,631],{"href":629,"rel":630},"https:\u002F\u002Fcdn.pixabay.com\u002Fphoto\u002F2017\u002F07\u002F07\u002F02\u002F05\u002Fsymbol-2480161%5C_960%5C_720.png",[32],"https:\u002F\u002Fcdn.pixabay.com\u002Fphoto\u002F2017\u002F07\u002F07\u002F02\u002F05\u002Fsymbol-2480161\\_960\\_720.png"," and send test message.",[57,634],{"className":635,"alt":62,"src":636,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081545\u002FScreen-Shot-2020-02-20-at-1.00.12-PM.png",[24,638,639,642],{},[15,640,641],{},"Logcat"," (step 5)からtokenを取得し追加します。",[57,644],{"className":645,"alt":62,"src":646,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081608\u002FScreen-Shot-2020-02-20-at-1.07.28-PM.png",[24,648,649,332],{},[15,650,331],{},[57,652],{"className":653,"alt":62,"src":654,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081635\u002FScreenshot_20200220-141558-768x1365.jpg",[24,656,657,659],{},[15,658,341],{},": 作成とメッセージ送信",[24,661,662,663,294],{},"テストが成功した後で、続けるために\"",[15,664,665],{},"Next",[24,667,668,672],{},[57,669],{"className":670,"alt":62,"src":671,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081717\u002FScreen-Shot-2020-02-20-at-2.22.42-PM.png",[96,673],{},[24,675,676,680],{},[57,677],{"className":678,"alt":62,"src":679,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081729\u002FScreen-Shot-2020-02-20-at-2.25.56-PM.png",[96,681],{},[57,683],{"className":684,"alt":62,"src":685,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081755\u002FScreen-Shot-2020-02-20-at-2.23.43-PM.png",[24,687,688,689,691],{},"メッセージを送信するため\"",[15,690,374],{},"\"を送信します。",[24,693,694,332],{},[15,695,331],{},[382,697,699,704],{"className":698},[385,386,387],[57,700],{"className":701,"alt":62,"src":702,"style":703},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081831\u002FScreenshot_20200220-144456_One-UI-Home-768x652.jpg","width: 60%;",[57,705],{"className":706,"alt":62,"src":707,"style":708},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081852\u002FScreenshot_20200220-144505-768x954.png","width: 40%;",[96,710],{},[57,712],{"className":713,"alt":62,"src":714,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081914\u002FScreenshot_20200220-144509-576x1024.jpg",[19,716,718],{"id":717},"v-realtime-database","V. Realtime Database",[188,720,191],{"id":721},"_1-紹介-2",[24,723,724],{},"Firebase Realtime Databaseはクラウドホスティングデータベースです。データはJson形式で保存され、クライアントに毎回リアルタイムに同期されます。iOS, Android JavaScript SDKを使ったあなたのクライアントのクロスプラットフォームアプリはrealtime database instanceに同期され、自動で最新のデータにアップデートされます。",[188,726,728],{"id":727},"_2-get-start","2. Get start",[24,730,731,733,734,737,738,55],{},[15,732,50],{},": \"build.gradle\"に“",[15,735,736],{},"implementation 'com.google.firebase:firebase-database:19.2.1'"," \" (app)を追加します。そして\"",[15,739,213],{},[57,741],{"className":742,"alt":62,"src":743,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082008\u002FScreen-Shot-2020-02-20-at-3.26.15-PM-1024x382.png",[24,745,746,748],{},[15,747,69],{},": テストのためにrealtime databaseのrules設定します。",[57,750],{"className":751,"alt":62,"src":752,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082049\u002FScreen-Shot-2020-02-20-at-3.38.14-PM-1024x541.png",[24,754,755,756,761],{},"realtime databaseのrulesについては",[28,757,760],{"href":758,"rel":759},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fdatabase\u002Fsecurity\u002Fquickstart#sample-rules%22",[32],"こちら","を確認してください。",[24,763,764,766],{},[15,765,79],{},": UserModelクラスを作成します。",[224,768,771],{"className":769,"code":770,"language":229},[227],"data class UserModel(\n    var id: String = \"\",\n    var name: String = \"\",\n    var age: Int = 0,\n    var email: String = \"\"\n) {\n    override fun toString(): String {\n        return \"UserModel(id='$id', name='$name', age=$age, email='$email')\"\n    }\n}\n",[231,772,770],{"__ignoreMap":62},[24,774,775,777],{},[15,776,106],{},": 3つの項目(name, age and email)があるLayoutを作成し、User dataを含めるために1つのrecycler viewを追加します。 これが作成したlayoutです。",[57,779],{"className":780,"alt":62,"src":781,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082107\u002FScreenshot_20200220-160304-739x1536.png",[24,783,784,787],{},[15,785,786],{},"Step 5:"," データベースを記述します。 最初に_databaseReference_を初期化します。",[224,789,792],{"className":790,"code":791,"language":229},[227],"private fun initDatabase() {\n    databaseReference = FirebaseDatabase.getInstance().reference\n}\n",[231,793,791],{"__ignoreMap":62},[24,795,796],{},"次に、入力した値を取得し、データベースに追加します。",[224,798,801],{"className":799,"code":800,"language":229},[227],"private fun insertUser() {\n    if (edt_name.text.isNullOrEmpty() || edt_age.text.isNullOrEmpty() || edt_email.text.isNullOrEmpty()) {\n        Toast.makeText(this, \"Some field are missing.\", Toast.LENGTH_SHORT).show()\n        return\n    }\n\n    \u002F\u002Fget key\n    val key = databaseReference.child(\"User\").push().key\n\n    \u002F\u002Fget user data from edit text\n    val user = UserModel(\n        name = edt_name.text.toString(),\n        age = edt_age.text.toString().toInt(),\n        email = edt_email.text.toString()\n    )\n\n    key?.let {\n        user.id = key\n\n        \u002F\u002F Write a data to the database\n        databaseReference.child(\"User\").child(key).setValue(user).addOnSuccessListener {\n            clearText()\n            \u002F\u002Fget user data from database\n            getUser()\n            \u002F\u002Fscroll to new item\n            recycler_user.scrollToPosition(recyclerAdapter.userList.size - 1)\n        }\n            .addOnFailureListener {\n                Toast.makeText(this, \"Upload Error\", Toast.LENGTH_SHORT).show()\n            }\n    }\n}\n",[231,802,800],{"__ignoreMap":62},[24,804,805],{},"Insertボタンのイベントのコードを追加します。",[224,807,810],{"className":808,"code":809,"language":229},[227],"btn_insert.setOnClickListener {\n    insertUser()\n}\n",[231,811,809],{"__ignoreMap":62},[24,813,814,815,818],{},"アプリの\"",[15,816,817],{},"Insert","\"ボタンをクリックした後で、データはすぐにFirebaseに送られます。",[224,820,822],{"className":821,"code":62,"language":229},[227],[231,823,62],{"__ignoreMap":62},[24,825,826],{},[15,827,828],{},"データの読み込み:",[224,830,833],{"className":831,"code":832,"language":229},[227],"databaseReference.child(\"User\").addValueEventListener(object : ValueEventListener {\n    override fun onCancelled(dataError: DatabaseError) {\n        Toast.makeText(this@DataBaseActivity, \"Upload Error\", Toast.LENGTH_SHORT).show()\n    }\n\n    override fun onDataChange(dataSnapshot: DataSnapshot) {\n        \n        \u002F\u002Fget user list from database\n        val list = dataSnapshot.children.mapNotNull {\n            it.getValue(UserModel::class.java)\n        }\n        list.forEach {\n            Log.i(\"Users\", it.toString())\n        }\n        \u002F\u002Fadd to recycler view\n        if (list.isNotEmpty()) {\n            recyclerAdapter.userList.clear()\n            recyclerAdapter.userList.addAll(list)\n            recyclerAdapter.notifyDataSetChanged()\n        }\n    }\n})\n",[231,834,832],{"__ignoreMap":62},[57,836],{"className":837,"alt":62,"src":838,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082214\u002FScreenshot_20200221-082417-739x1536.png",[24,840,841],{},[15,842,843],{},"データの更新:",[224,845,848],{"className":846,"code":847,"language":229},[227],"private fun updateUser() {\n    user?.let {\n        \u002F\u002Fcreate new user object\n        val user = UserModel(\n            it.id,\n            edt_name.text.toString(),\n            edt_age.text.toString().toInt(),\n            edt_email.text.toString()\n        )\n        \u002F\u002Fupdate user\n        databaseReference.child(\"User\u002F${it.id}\").setValue(user)\n    }\n}\n",[231,849,847],{"__ignoreMap":62},[57,851],{"className":852,"alt":62,"src":853,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082239\u002FScreen-Shot-2020-02-20-at-5.13.21-PM.png",[24,855,856,332],{},[15,857,858],{},"データの削除",[224,860,863],{"className":861,"code":862,"language":229},[227],"private fun deleteUser() {\n    \u002F\u002F get user id\n    val query =\n        databaseReference.child(\"User\").orderByChild(\"id\").equalTo(user?.id)\n\n    query.addListenerForSingleValueEvent(object : ValueEventListener {\n        override fun onDataChange(dataSnapshot: DataSnapshot) {\n            for (user in dataSnapshot.children) {\n                \u002F\u002Fremove user\n                user.ref.removeValue().addOnSuccessListener {\n                    clearText()\n                }\n            }\n        }\n\n        override fun onCancelled(databaseError: DatabaseError) {\n            Log.e(\n                TAG,\n                \"onCancelled\",\n                databaseError.toException()\n            )\n        }\n    })\n    getUser()\n}\n",[231,864,862],{"__ignoreMap":62},[57,866],{"className":867,"alt":62,"src":868,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082302\u002FScreen-Shot-2020-02-20-at-5.14.08-PM.png",[19,870,872],{"id":871},"vi-参考文献","VI. 参考文献",[24,874,875],{},[28,876,877],{"href":877,"rel":878},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fguides",[32],[24,880,881],{},[28,882,883],{"href":883,"rel":884},"https:\u002F\u002Fgithub.com\u002Ffirebase\u002Fquickstart-android\u002Fblob\u002F995be41782f84b3c54e41d7d7e5d3a5048fe329e\u002Fmessaging\u002Fapp\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fgoogle\u002Ffirebase\u002Fquickstart\u002Ffcm\u002Fkotlin\u002FMyFirebaseMessagingService.kt#L65-L77",[32],[24,886,887],{},[28,888,889],{"href":889,"rel":890},"https:\u002F\u002Fproandroiddev.com\u002Ffirebase-android-playground-realtime-database-560d4e18404a",[32],[24,892,893],{},[28,894,895],{"href":895,"rel":896},"https:\u002F\u002Fwww.learnhowtoprogram.com\u002Fandroid\u002Fdata-persistence\u002Ffirebase-reading-data-and-event-listeners",[32],{"title":62,"searchDepth":898,"depth":898,"links":899},2,[900,901,902,907,911,915],{"id":21,"depth":898,"text":22},{"id":37,"depth":898,"text":38},{"id":185,"depth":898,"text":186,"children":903},[904,906],{"id":190,"depth":905,"text":191},3,{"id":197,"depth":905,"text":198},{"id":404,"depth":898,"text":405,"children":908},[909,910],{"id":408,"depth":905,"text":191},{"id":414,"depth":905,"text":198},{"id":717,"depth":898,"text":718,"children":912},[913,914],{"id":721,"depth":905,"text":191},{"id":727,"depth":905,"text":728},{"id":871,"depth":898,"text":872},[917,918],"mobile","tech talk","Briswell Vietnam Co Ltd","2020-02-25","Firebaseとは Google FirebaseはGoogleのバックエンドアプリケーションで開発者がiOSやandroid、","md",{},true,"\u002Fja\u002Fnews\u002Fandroid-firebase-for-beginer",null,{"title":5,"description":921},"ja\u002Fnews\u002Fandroid-firebase-for-beginer","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F06\u002F05080300\u002FFirebase.jpg","w_TeL5rgds-Y4ihb3rncPBHPpKWfygXYYNascWyd6Xo",1782205039171]