免费试用

中文化、本土化、云端化的在线跨平台软件开发工具,支持APP、电脑端、小程序、IOS免签等等

android修改个人信息app开发

概述

对于很多具有个人账户体系的Android应用程序,都需要用户修改个人信息,比如头像、昵称、性别等等。本文将详细介绍如何在Android应用中开发修改个人信息的功能。

实现原理

要实现修改个人信息的功能,首先需要考虑如何存储用户的信息。我们可以使用本地存储和远程服务器存储两种方式。

本地存储方式是将用户信息保存在客户端设备上的本地数据库或者SharedPreferences中。使用SQLite数据库,可以创建一个UserInfo表,并在其中添加用户名、头像、昵称、性别等字段,然后将用户的个人信息存储在该表中。要修改个人信息,只需要对该表进行更新即可。

远程服务器存储方式是将用户信息保存在服务器上,通常是通过网络请求进行操作。我们可以使用后端框架,比如SpringMVC搭建一个服务器程序,将用户信息保存在数据库中。

具体实现方案

本地存储方案

1.创建数据库

创建一个SQLite数据库,并在其中创建一个UserInfo表,该表包含UserName、Avatar、NickName、Gender四个字段。

首先在app/build.gradle中添加下面的依赖项,以便使用SQLite数据库。

```

dependencies {

implementation 'com.android.support:support-core-utils:28.0.0'

implementation 'com.j256.ormlite:ormlite-android:5.1'

implementation 'com.j256.ormlite:ormlite-core:5.1'

}

```

然后创建一个DatabaseHelper类,实现或者扩展OrmLiteSqliteOpenHelper类。

```

public class DatabaseHelper extends OrmLiteSqliteOpenHelper {

private static final String DATABASE_NAME = "UserInfo.db";

private static final int DATABASE_VERSION = 1;

private Dao userInfoDao;

public DatabaseHelper(Context context) {

super(context, DATABASE_NAME, null, DATABASE_VERSION);

}

@Override

public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {

try {

TableUtils.createTable(connectionSource, UserInfo.class);

} catch (SQLException e) {

e.printStackTrace();

}

}

@Override

public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int i, int i1) {

try {

TableUtils.dropTable(connectionSource, UserInfo.class, true);

onCreate(sqLiteDatabase, connectionSource);

} catch (SQLException e) {

e.printStackTrace();

}

}

public Dao getUserInfoDao() throws SQLException {

if (userInfoDao == null) {

userInfoDao = getDao(UserInfo.class);

}

return userInfoDao;

}

}

```

这里使用OrmLiteSqliteOpenHelper来创建SQLite数据库,并提供数据库升级和降级的功能。

2.创建用户信息实体和查询和修改方法

接着创建UserInfo实体类,以及操作数据库的方法。以下是UserInfo类的示例:

```

@DatabaseTable(tableName = "UserInfo")

public class UserInfo {

@DatabaseField(generatedId = true)

private int id;

@DatabaseField(columnName = "UserName")

private String userName;

@DatabaseField(columnName = "Avatar")

private String avatar;

@DatabaseField(columnName = "NickName")

private String nickName;

@DatabaseField(columnName = "Gender")

private String gender;

public UserInfo() {

}

public UserInfo(int id, String userName, String avatar, String nickName, String gender) {

this.id = id;

this.userName = userName;

this.avatar = avatar;

this.nickName = nickName;

this.gender = gender;

}

// getter和setter方法省略

}

```

使用这个类来查询和修改用户的个人信息。

查询用户信息:

```

public UserInfo queryUserInfo(Context context, String userName) {

try {

DatabaseHelper helper = new DatabaseHelper(context);

Dao userInfoDao = helper.getUserInfoDao();

UserInfo userInfo = userInfoDao.queryBuilder().where().eq("UserName", userName).queryForFirst();

helper.close();

return userInfo;

} catch (SQLException e) {

e.printStackTrace();

return null;

}

}

```

修改用户信息:

```

public boolean updateUserInfo(Context context, String userName, String avatar, String nickName, String gender) {

try {

DatabaseHelper helper = new DatabaseHelper(context);

Dao userInfoDao = helper.getUserInfoDao();

UpdateBuilder updateBuilder = userInfoDao.updateBuilder();

updateBuilder.updateColumnValue("Avatar", avatar);

updateBuilder.updateColumnValue("NickName", nickName);

updateBuilder.updateColumnValue("Gender", gender);

updateBuilder.where().eq("UserName", userName);

int numOfRowsAffected = updateBuilder.update(); //修改行

helper.close();

return numOfRowsAffected > 0;

} catch (SQLException e) {

e.printStackTrace();

return false;

}

}

```

可以看到这个方法将头像、昵称和性别更新到了数据库中,接着调用updateBuilder.update()方法来进行信息更新操作。

3.创建修改个人信息的界面

接下来,我们需要在应用中创建一个修改个人信息的界面。该界面包含UserName输入框、Avatar显示区(可以点击修改)、NickName输入框、Gender选择框等。

我们可以使用Android中的LinearLayout、RelativeLayout、TextView、EditText、ImageView等控件来创建布局。将修改个人信息的界面布局放在activity_modify_user_info.xml文件中。

4.修改个人信息界面的逻辑代码

创建ModifyUserInfoActivity文件,并在该文件中声明常量和变量。实现下面的代码:

```

public class ModifyUserInfoActivity extends AppCompatActivity {

private static final int REQUEST_CODE_PICK_PHOTO = 1; // 请求码——选择图片

private static final int REQUEST_CODE_TAKE_PHOTO = 2; // 请求码——拍照

private ImageView ivAvatar; // 头像显示区

private EditText etUserName; // 用户名输入框

private EditText etNickName; // 昵称输入框

private Button btnTakePhoto; // 选择拍照的按钮

private Button btnPickPhoto; // 选择图片的按钮

private RadioGroup rgGender; // 性别单选组

private String mBase64Avatar; // base64格式的头像

private String mUserName; // 用户名

private String mNickName; // 昵称

private String mGender; // 性别

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_modify_user_info);

ivAvatar = findViewById(R.id.ivAvatar);

etUserName = findViewById(R.id.etUserName);

etNickName = findViewById(R.id.etNickName);

btnTakePhoto = findViewById(R.id.btnTakePhoto);

btnPickPhoto = findViewById(R.id.btnPickPhoto);

rgGender = findViewById(R.id.rgGender);

// 添加头像点击事件

ivAvatar.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

showPickPhotoDialog();

}

});

// 添加拍照按钮点击事件

btnTakePhoto.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

openCamera();

}

});

// 添加选择相册图片按钮点击事件

btnPickPhoto.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

pickPhoto();

}

});

// 添加性别单选组选择事件

rgGender.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {

@Override

public void onCheckedChanged(RadioGroup group, int checkedId) {

if (checkedId == R.id.rbMale) {

mGender = "男";

} else if (checkedId == R.id.rbFemale) {

mGender = "女";

}

}

});

// 获取当前用户信息并显示

SharedPreferences sp = getSharedPreferences("userInfo", MODE_PRIVATE);

mUserName = sp.getString("UserName", "");

UserInfo userInfo = queryUserInfo(this, mUserName);

mBase64Avatar = userInfo.getAvatar();

mNickName = userInfo.getNickName();

mGender = userInfo.getGender();

etUserName.setText(mUserName);

ivAvatar.setImageBitmap(Utils.decodeBase64(mBase64Avatar));

etNickName.setText(mNickName);

if (mGender.equals("男")) {

rgGender.check(R.id.rbMale);

} else if (mGender.equals("女")) {

rgGender.check(R.id.rbFemale);

}

}

/**

* 保存按钮点击事件

* 在本地数据库中更新用户信息

*/

public void onSaveBtnClicked(View view) {

String avatar = mBase64Avatar;

String nickName = etNickName.getText().toString();

String gender = mGender;

if (updateUserInfo(this, mUserName, avatar, nickName, gender)) {

Toast.makeText(this, "修改成功!", Toast.LENGTH_SHORT).show();

finish();

} else {

Toast.makeText(this, "修改失败!", Toast.LENGTH_SHORT).show();

}

}

}

```

在这个代码中,我们绑定了头像显示区、用户名、昵称、性别的显示控件,使用SharedPreferences获取当前登录的用户名。获取到当前用户名之后,我们使用queryUserInfo()方法从本地数据库中获取当前用户信息。然后修改头像、用户昵称、性别信息并保存至本地数据库中。

我们还为头像区添加了点击事件,使用showPickPhotoDialog()方法展示Dialog让用户选择是从相册中选择图片还是从摄像头中拍照。

5.选择图片和拍照操作

我们还需要实现选择图片和拍照的操作。这里使用了Ucrop的第三方库来剪裁头像图片。具体实现如下:

```

/**

* 选择图片

*/

private void pickPhoto() {

Intent intent = new Intent(Intent.ACTION_PICK);

intent.setType("image/*");

startActivityForResult(intent, REQUEST_CODE_PICK_PHOTO);

}

/**

* 拍照

*/

private void openCamera() {

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

startActivityForResult(intent, REQUEST_CODE_TAKE_PHOTO);

}

/**

* 获得相册图片或照片后的操作

*/

@Override

protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RESULT_OK) {

switch (requestCode) {

case REQUEST_CODE_PICK_PHOTO:

if (data != null) {

Uri originalUri = data.getData(); // 获得相册图片的uri

startCropActivity(originalUri);

}

break;

case REQUEST_CODE_TAKE_PHOTO:

if (data != null) {

Bundle bundle = data.getExtras();

if (bundle != null) {

Bitmap bitmap = (Bitmap) bundle.get("data");

if (bitmap == null) {

return;

}

Uri imageUri = Utils.saveBitmap(bitmap, Utils.getTempFile(this).getPath());

startCropActivity(imageUri);

}

}

break;

case UCrop.REQUEST_CROP:

if (data != null) {

Uri newUri = UCrop.getOutput(data);

Bitmap bitmap = Utils.decodeUri(this, newUri);

mBase64Avatar = Utils.encodeBitmap(bitmap);

ivAvatar.setImageBitmap(bitmap);

}

break;

}

}

}

/**

* 开始剪裁图片

*/

private void startCropActivity(Uri uri) {

UCrop.Options options = new UCrop.Options();

options.setToolbarTitle(getString(R.string.app_name));

options.setToolbarColor(ContextCompat.getColor(this, R.color.colorPrimary));

options.setStatusBarColor(ContextCompat.getColor(this, R.color.colorPrimaryDark));

options.setActiveWidgetColor(ContextCompat.getColor(this, R.color.colorAccent));

options.setToolbarWidgetColor(ContextCompat.getColor(this, R.color.white));

options.setCompressionQuality(80);

Uri destinationUri = Uri.fromFile(new File(getCacheDir(), String.valueOf(System.currentTimeMillis())));

UCrop.of(uri, destinationUri)

.withOptions(options)

.withAspectRatio(1, 1)

.withMaxResultSize(720, 720)

.start(this);

}

/**

* 显示选择照片、拍照的Dialog

*/

private void showPickPhotoDialog() {

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("选择图片");

String[] options = {"相册选择", "拍照"};

builder.setItems(options, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialogInterface, int i) {

switch (i) {

case 0:

pickPhoto();

break;

case 1:

openCamera();

break;

}

}

});

builder.create().show();

}

```

这里使用了第三方库UCrop来进行图片的裁剪操作,并使用Utils.encodeBitmap、Utils.decodeUri等辅助方法对图片进行编码和解码操作。

远程服务器存储方案

对于远程服务器存储方案,我们需要使用后端框架SpringMVC来开发。具体开发方式比较复杂,需要涉及到数据库、Java Web等知识点。这里不再详细展开介绍,而推荐大家可以通过阅读SpringMVC相关的文档,自行开发实现。

总结

本文中介绍了实现Android修改个人信息的两种方案:本地存储方案和远程服务器存储方案。本地存储方案使用了SQLite数据库来实现,而远程服务器存储方案则需要使用SpringMVC后端框架进行开发。不论选择哪种方案,都是困难重重的任务,需要熟练掌握相关的技术和知识点。


相关知识:
如何启动app的开发者选项
开发者选项是Android设备上的一个隐藏功能,它允许开发者在开发和测试应用程序时访问特定的选项和功能。这些选项包括USB调试、布局边界、GPU渲染、不保留活动等等。在使用Android设备进行开发和测试时,启用开发者选项可以提高工作效率并加快调试的速度。
2024-01-10
html开发app的好处
HTML开发App有以下几个好处:1. 跨平台:使用HTML开发App可以实现一次开发多平台使用。HTML可以在不同的操作系统和设备上运行,包括Windows、MacOS、iOS、Android等。2. 简单易学:相比其他开发语言,HTML是一种非常简单易
2023-07-14
app壳开发
APP壳开发是指在原有的应用程序基础上,通过添加一层壳来实现一些特定的功能或者增加一些额外的保护措施。这样做的目的主要有两个:一是为了提升应用程序的功能和用户体验,二是为了增强应用程序的安全性和防护能力。下面我将详细介绍APP壳开发的原理和具体步骤。一、原
2023-06-29
app开发定制服务
App开发定制服务是指针对客户的需求,进行App开发的全流程服务。 它能满足客户特定的需求,提供更加个性化、专业化的服务。而针对不同的需求,定制的开发服务也会相应地具备不同的开发模式及开发内容,例如:App开发、App二次开发、App定制化开发,App设计
2023-06-29
app开发哪些细节需要引起注意
在进行APP开发的过程中,有许多细节需要我们引起注意,其中包括以下几个方面。一、界面设计APP的界面设计是很重要的,一般一个APP开发出现问题的情况下,很大部分是因为界面设计问题,例如:UI风格不够统一,颜色搭配不合理,按钮布局不合理等导致用户视觉体验差。
2023-06-29
app编写开发视频
App编写开发是指通过编程语言和开发平台,如Android、iOS等,创建符合用户需求的应用程序。App的开发需要时间和团队精神,因为需要包含多个方面的工作,如UI设计,功能配置,测试和发布。下面我们将详细介绍app编写开发的原理。第一步:熟悉编程语言和开
2023-05-06