如果您正在寻找一个功能丰富且具有成本效益的安全无服务器平台,则可以尝试使用MongoDB Stitch 。 除了提供方便的服务器端功能(例如功能,服务网络挂钩和用户身份验证)外,它还与功能强大且成熟的基于云的数据存储解决方案MongoDB Atlas紧密集成。
在本教程中,我将向您展示如何使用MongoDB Stitch和MongoDB Atlas集群从头开始为Android创建记笔记应用程序。 我还将指导您如何将Stitch支持的身份验证提供程序Google Sign-In集成到应用程序中。
先决条件
要充分利用本教程,您需要:
- Android Studio 3.1或更高版本
- MongoDB Atlas帐户
- 运行Android 5.0或更高版本的设备或模拟器
如果您还没有这样做,我也建议您先阅读之前的教程,了解如何在Android应用程序中使用Stitch 。
1.创建针迹应用程序
您需要一个Stitch应用程序,才能在您的Android项目中使用Stitch平台提供的服务。 因此,登录到您的MongoDB Atlas帐户并导航到Stitch Apps部分。
按创建新应用程序按钮。 在弹出的对话框中,为应用程序指定一个有意义的名称,从下拉列表中选择一个MongoDB Atlas集群,然后按“ 创建”按钮。
应用程序准备就绪后,转到“ 客户端”部分,然后切换到“ Java(Android)”选项卡以确定其应用程序ID是什么。 在本教程的后面,您将需要ID。
2.设置身份验证
您将使用Google作为今天要创建的应用的身份验证提供程序。 换句话说,您将允许最终用户使用其Google帐户登录该应用程序。
在Stitch的管理控制台中,设置任何身份验证提供程序仅需一点时间。 但是,在此之前,您必须从身份验证提供程序中获取一些重要的详细信息。 要从Google获取详细信息,请在浏览器中打开一个新标签,登录到您的Google帐户,然后转到Google Cloud Platform API仪表板 。
按下[ 建立专案]按钮来建立新的Google Cloud专案。 给项目命名后,按创建按钮。
项目准备就绪后,转到“ 凭据”部分,然后打开“ OAuth同意”屏幕选项卡。 现在,您只能在此处填写“ 应用程序名称”字段,然后按“ 保存”按钮。
然后,按创建凭据按钮,选择OAuth客户端ID选项,然后选择Android作为应用程序类型。
现在,系统将提示您输入要用于Android应用的程序包名称和SHA-1指纹。 对于本教程,建议您使用调试证书的指纹。 要获取它,请打开一个终端并运行以下命令:
keytool -exportcert -alias androiddebugkey \
-keystore ~/.android/debug.keystore \
-list
复制指纹并将其粘贴到表单中后,按“ 创建”按钮。
此时,您的Android应用将可以使用Google登录。 但是,您必须允许Stitch应用程序也使用它。 因此,再次按创建凭据按钮。 这次,选择Web应用程序作为应用程序的类型。
当提示您输入授权的重定向URI时,请使用Stitch的回调URL: https : //stitch.mongodb.com/api/client/v2.0/auth/callback
现在按下创建按钮时,您将看到一个包含两个字符串的弹出窗口:一个客户端ID和一个客户端密码。 记下它们,然后返回Stitch管理控制台。
在控制台的“ 用户”部分中,切换到“ 提供者”标签,然后选择Google 。 启用它之后,键入客户端ID和客户端密码,然后按保存按钮。
3.添加规则
您应用程序的用户一定不能看到彼此的注释。 仅允许他们查看自己创建的注释。 要执行此规则,请转到“ 规则”部分,然后按“ 添加集合”按钮。
现在,您可以为MongoDB数据库命名,并指定将存储所有注释的集合的名称。 假设数据库的名称为notes_db ,集合的名称为notes 。
接下来,选择“ 用户只能读取和写入自己的数据规则模板”,该模板符合您的应用程序的要求,并说将用于存储用户身份验证ID的字段的名称为user_id 。
最后,按添加收藏夹按钮。
如果要仔细查看刚刚创建的规则,请随时按Advanced Mode(高级模式)按钮,该按钮向您显示该规则的JSON等价物。
4.配置一个Android项目
现在,Stitch应用程序已准备就绪,您可以开始构建Android应用程序了。 因此,请创建一个新的具有空活动的Android Studio项目,并确保其程序包名称与您之前输入的名称相同。
为了能够在项目中使用Stitch SDK,请在应用程序级别的build.gradle文件中添加以下implementation
依赖项 :
implementation 'org.mongodb:stitch-android-sdk:4.0.5'
为了支持Google登录,还添加了对Google Play服务的依赖关系。
implementation 'com.google.android.gms:play-services-auth:15.0.1'
应用程序中将需要一些Material Design小部件,例如卡片和浮动操作按钮。 因此也添加以下依赖项:
implementation 'com.android.support:design:27.1.1'
implementation 'com.android.support:cardview-v7:27.1.1'
implementation 'com.afollestad.material-dialogs:core:0.9.6.0'
最后,将您在Stitch管理控制台中提到的Stitch应用程序ID和客户端ID添加为strings.xml文件中的项目。
<string name="stitch_client_app_id">YOUR_APP_ID</string>
<string name="google_client_id">YOUR_CLIENT_ID</string>
5.创建布局
用户只有登录后才能使用笔记记录应用程序。因此,打开应用程序后,您必须向他们显示登录按钮。 最快的方法是在主要活动的布局中使用SignInButton
小部件:
<com.google.android.gms.common.SignInButton
android:id="@+id/sign_in_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>
成功登录后,您将把用户重定向到另一个活动,该活动包含一个ListView
小部件和一个FloatingActionButton
小部件,该活动将显示用户的便笺,该控件可显示用户的便笺,用户可按该小部件来创建新便笺。 因此,创建另一个空活动并将以下代码添加到其布局XML文件中:
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/notes_container"
android:dividerHeight="16dp"
android:divider="@android:color/transparent"/>
<android.support.design.widget.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:src="@drawable/ic_add_black_24dp"
android:id="@+id/add_note_button"
android:tint="@android:color/white"/>
</RelativeLayout>
ListView
小部件的每个项目都是一个注释。 为了简单CardView
,假设注释的布局只有一个CardView
小部件,其中包含TextView
小部件。 因此,创建一个名为layout_note.xml的新布局XML文件, 并向其中添加以下代码:
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/note_text"
style="@style/TextAppearance.AppCompat.Body1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp" />
</android.support.v7.widget.CardView>
6.实施Google登录
当用户按下登录按钮时,您必须启动Google的登录工作流程。 因此,在第一个活动中,向按钮添加一个单击事件处理程序。
在处理程序内部,您可以继续创建一个GoogleSignInOptions
对象,该对象配置为使用默认登录选项。 因为您的Stitch应用程序(可以被认为是后端服务器)也必须是登录过程的一部分,所以请确保您调用requestServerAuthCode()
方法并将客户端ID传递给该方法。 以下代码向您展示了如何:
val signInOptions =
GoogleSignInOptions.Builder(
GoogleSignInOptions.DEFAULT_SIGN_IN
).requestServerAuthCode(
getString(R.string.google_client_id)
).build()
现在,您可以通过调用getClient()
方法并将GoogleSignInOptions
对象作为参数传递给它来创建GoogleSignIn
客户端。 使用客户端,您可以通过从客户端获取登录意图并将其传递给活动的startActivityForResult()
方法来轻松启动登录工作流程。 这是如何做:
val signInClient = GoogleSignIn.getClient(
this@MainActivity, signInOptions
)
startActivityForResult(
signInClient.signInIntent,
1 // request code
)
要接收刚刚触发的活动的结果,必须重写onActivityResult()
方法。 在其中,您可以访问新的Intent
对象,可以将其传递给getSignedInAccountFromIntent()
方法以标识您的用户。
override fun onActivityResult(requestCode: Int,
resultCode: Int,
data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val signedInAccount =
GoogleSignIn.getSignedInAccountFromIntent(data)
// More code here
}
万一用户失败或拒绝登录,现在您将有一个例外。 通过显示内容丰富的Toast
消息并关闭应用程序来进行处理。
if(signedInAccount.exception != null) {
Toast.makeText(this,
"You must sign in first", Toast.LENGTH_LONG).show()
finish()
return
}
但是,如果成功登录,您将有权访问可用于创建GoogleCredential
对象的服务器身份验证代码。 通过将对象传递到项目的默认Stitch客户端的loginWithCredential()
方法 ,您既可以注册用户,也可以将用户登录到您的应用程序。
方法成功完成后,应用程序应切换到第二个活动,该活动具有用于显示注释和添加新注释的用户界面元素。 以下代码向您展示了如何做到这一点:
Stitch.getDefaultAppClient().auth
.loginWithCredential(
GoogleCredential(signedInAccount.result.serverAuthCode)
)
.addOnSuccessListener {
// Open activity that shows the notes
startActivity(
Intent(this@MainActivity,
NotesActivity::class.java
)
)
}
如果您现在构建并运行该应用程序,则应该可以使用您的一个Google帐户登录。
7.添加注释
在第二个活动中,您将同时需要Stitch客户端和MongoDB Atlas客户端。 您将需要前者获得用户的身份验证ID,而后者则需要在您的MongoDB Atlas集群上执行读写操作。 因此,将它们都添加为活动的私有字段。
private val stitchClient = Stitch.getDefaultAppClient()
private val atlasClient = stitchClient.getServiceClient(
RemoteMongoClient.factory,
"mongodb-atlas"
)
当用户按下浮动操作按钮时,您必须显示一个对话框,提示他们输入注释。 使用之前作为依赖项添加的“ 材质对话框”库,这样做非常直观。
以下代码显示了如何向按钮添加单击侦听器并创建基本的输入对话框:
add_note_button.setOnClickListener {
val dialog = MaterialDialog.Builder(this@NotesActivity)
.title("New Note")
.input("Type something", null, false,
{ _, note ->
// More code here
}
).build()
dialog.show()
}
在对话框的事件处理程序中,您可以访问用户键入的注释。要将其存储在MongoDB Atlas集群中,必须将其放入新的MongoDB文档中。 此外,为确保该注释仅对创建它的用户可见,该文档必须包含一个user_id
字段,其值与用户的身份验证ID匹配。 下面的代码位于事件处理程序中,向您展示如何创建文档:
val document = Document()
document["text"] = note.toString()
document["user_id"] = stitchClient.auth.user!!.id
现在,文档已经准备好了,您必须将其插入notes_db
数据库的notes
集合中。 这是获取数据库和集合的引用以及使用 insertOne()
方法插入文档的方法 :
val collection = atlasClient.getDatabase("notes_db")
.getCollection("notes")
collection.insertOne(document).addOnSuccessListener {
Toast.makeText(this@NotesActivity,
"One note saved", Toast.LENGTH_LONG).show()
}
如果立即运行该应用程序,则应该能够创建新笔记并保存它们。
8.显示注释
为了能够显示用户创建的注释,必须首先获取notes
集合中属于该用户的所有文档。 不过,您不必编写复杂的查询即可。 根据您之前创建的规则,Stitch会自动确保您在集合上运行的任何查询将仅返回用户拥有的那些文档。
创建一个新方法以显示注释。
private fun showNotes() {
// More code here
}
在该方法内部,您可以直接在notes
集合上调用find()
方法以创建可以获取用户注释的查询。 要异步执行查询,您必须然后调用into()
方法并将空列表传递给它。 成功完成后,查询结果将显示在列表中。
val notes = mutableListOf<Document>()
atlasClient.getDatabase("notes_db")
.getCollection("notes")
.find()
.into(notes)
.addOnSuccessListener {
// More code here
}
在成功侦听器内部,您现在必须创建ArrayAdapter
类的实例以呈现注释列表。 但是,您不能将Document
对象的列表直接传递给该类的构造函数。 您必须首先将其转换为String
对象的列表。 以下代码显示了如何使用map()
方法执行此操作:
val adapter = ArrayAdapter<String>(this@NotesActivity,
R.layout.layout_note, R.id.note_text,
notes.map {
it.getString("text") // Extract only the 'text' field
// of each document
}
)
适配器准备好后,可以通过将其分配给ListView
小部件的adapter
属性来使其工作。
notes_container.adapter = adapter
现在可以使用showNotes()
方法。 在onCreate()
方法内添加对它的调用,以便用户在活动打开后立即看到他们的笔记。 此外,如果您希望列表在创建新便笺后立即显示,我建议您还在附加到insertOne()
方法的成功监听器中添加对它的调用。
通过上述更改,如果再次运行该应用程序,则既可以添加新笔记,也可以查看现有笔记。
结论
在本教程中,您了解了创建由MongoDB Stitch支持的简单移动应用程序有多么容易。 您还学习了如何使用Google作为身份验证提供程序和Stitch的声明式访问规则来保护最终用户的数据安全和隐私。
要了解有关MongoDB Stitch的更多信息,请参阅其全面的官方文档 。