一、实验目的

掌握Intent启动外部应用并交互数据的方法,了解Android权限和访问外部文件的方法。

二、实验内容

在SQLite版本的班级名单基础上实现以下功能
1. 设计修改列表项的Fragment页面,支持调用相机和读取图库中照片;
2. 将拍摄的或选中的照片设置为该名单对应的头像,并在列表中更新显示;
3. 将名单和图片文件的对应关系保存在SQLite数据库中,下次重启应用的时候可以看到名单的头像;

三、结构搭建

导入图片

四、代码实现

 AndroidManifest.xml

<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

build.gradle

implementation 'androidx.recyclerview:recyclerview:1.0.0'

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/fragment_list"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"></androidx.constraintlayout.widget.ConstraintLayout>

fragment_listxml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".FragmentList"><EditTextandroid:id="@+id/edit_id"android:layout_width="wrap_content"android:layout_height="35dp"android:layout_marginStart="60dp"android:layout_marginTop="16dp"android:ems="10"android:hint="请输入学号"android:inputType="text"android:textSize="13sp"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><EditTextandroid:id="@+id/edit_name"android:layout_width="wrap_content"android:layout_height="35dp"android:layout_marginTop="8dp"android:ems="10"android:hint="请输入姓名"android:inputType="text"android:textSize="13sp"app:layout_constraintStart_toStartOf="@+id/edit_id"app:layout_constraintTop_toBottomOf="@+id/edit_id" /><EditTextandroid:id="@+id/edit_tel"android:layout_width="wrap_content"android:layout_height="35dp"android:layout_marginTop="8dp"android:ems="10"android:hint="请输入手机号"android:inputType="text"android:textSize="13sp"app:layout_constraintStart_toStartOf="@+id/edit_name"app:layout_constraintTop_toBottomOf="@+id/edit_name" /><ImageViewandroid:id="@+id/image_stu"android:layout_width="84dp"android:layout_height="65dp"android:layout_marginTop="16dp"android:layout_marginEnd="60dp"android:src="@drawable/ls"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="1.0"app:layout_constraintStart_toEndOf="@+id/edit_name"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:id="@+id/btn_commit"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="12dp"android:text="添加"app:layout_constraintStart_toStartOf="@+id/image_stu"app:layout_constraintTop_toBottomOf="@+id/image_stu" /><androidx.appcompat.widget.AppCompatImageButtonandroid:id="@+id/btn_id"android:layout_width="35dp"android:layout_height="35dp"android:layout_marginStart="16dp"android:layout_marginTop="16dp"android:adjustViewBounds="true"android:background="@android:drawable/btn_star_big_on"android:scaleType="fitXY"android:text="学号"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><androidx.appcompat.widget.AppCompatImageButtonandroid:id="@+id/btn_name"android:layout_width="35dp"android:layout_height="35dp"android:layout_marginTop="60dp"android:adjustViewBounds="true"android:background="@drawable/stu"android:scaleType="fitXY"android:text="姓名"app:layout_constraintStart_toStartOf="@+id/btn_id"app:layout_constraintTop_toTopOf="parent" /><androidx.appcompat.widget.AppCompatImageButtonandroid:id="@+id/btn_phone"android:layout_width="35dp"android:layout_height="35dp"android:layout_marginTop="100dp"android:adjustViewBounds="true"android:background="@android:drawable/sym_action_call"android:scaleType="fitXY"android:text="手机号"app:layout_constraintStart_toStartOf="@+id/btn_name"app:layout_constraintTop_toTopOf="parent" /><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rcv_stu"android:layout_width="match_parent"android:layout_height="592dp"android:layout_marginTop="56dp"app:layout_constraintTop_toBottomOf="@+id/btn_commit"tools:layout_editor_absoluteX="0dp" /><Buttonandroid:id="@+id/btn_getPhone"android:layout_width="386dp"android:layout_height="44dp"android:text="获取手机通讯录联系人"app:layout_constraintBottom_toTopOf="@+id/rcv_stu"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/edit_tel" /></androidx.constraintlayout.widget.ConstraintLayout>

list_item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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="90dp"><ImageViewandroid:id="@+id/imageView"android:layout_width="86dp"android:layout_height="66dp"android:layout_marginStart="4dp"android:layout_marginTop="12dp"android:src="@drawable/ls"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/tv_id"android:layout_width="96dp"android:layout_height="20dp"android:text="学号"app:layout_constraintEnd_toEndOf="@+id/tv_name"app:layout_constraintHorizontal_bias="1.0"app:layout_constraintStart_toStartOf="@+id/tv_name"app:layout_constraintTop_toTopOf="@+id/imageView"tools:ignore="MissingConstraints" /><TextViewandroid:id="@+id/tv_name"android:layout_width="96dp"android:layout_height="20dp"android:layout_marginStart="64dp"android:text="姓名"app:layout_constraintBottom_toTopOf="@+id/tv_tel"app:layout_constraintStart_toEndOf="@+id/imageView"app:layout_constraintTop_toBottomOf="@+id/tv_id"tools:ignore="MissingConstraints" /><TextViewandroid:id="@+id/tv_tel"android:layout_width="96dp"android:layout_height="21dp"android:text="手机号"app:layout_constraintBottom_toBottomOf="@+id/imageView"app:layout_constraintEnd_toEndOf="@+id/tv_name"app:layout_constraintStart_toStartOf="@+id/tv_name" /><androidx.appcompat.widget.AppCompatImageButtonandroid:id="@+id/btn_delete"android:layout_width="36dp"android:layout_height="40dp"android:layout_marginStart="12dp"android:text="删除"app:layout_constraintBottom_toBottomOf="@+id/tv_tel"app:layout_constraintStart_toEndOf="@+id/btn_call"app:layout_constraintTop_toTopOf="@+id/tv_id"app:srcCompat="@android:drawable/btn_dialog" /><Buttonandroid:id="@+id/btn_call"android:layout_width="75dp"android:layout_height="47dp"android:layout_marginStart="12dp"android:text="Call"app:layout_constraintBottom_toBottomOf="@+id/tv_tel"app:layout_constraintStart_toEndOf="@+id/tv_name"app:layout_constraintTop_toTopOf="@+id/tv_id"app:layout_constraintVertical_bias="0.526" /><TextViewandroid:id="@+id/textView"android:layout_width="50dp"android:layout_height="20dp"android:text="学号:"app:layout_constraintEnd_toEndOf="@+id/textView2"app:layout_constraintStart_toStartOf="@+id/textView2"app:layout_constraintTop_toTopOf="@+id/imageView" /><TextViewandroid:id="@+id/textView2"android:layout_width="50dp"android:layout_height="20dp"android:text="姓名:"app:layout_constraintBottom_toTopOf="@+id/textView3"app:layout_constraintEnd_toStartOf="@+id/tv_name"app:layout_constraintHorizontal_bias="0.571"app:layout_constraintStart_toEndOf="@+id/imageView"app:layout_constraintTop_toBottomOf="@+id/textView"app:layout_constraintVertical_bias="0.294" /><TextViewandroid:id="@+id/textView3"android:layout_width="50dp"android:layout_height="20dp"android:text="手机号:"app:layout_constraintBottom_toBottomOf="@+id/imageView"app:layout_constraintEnd_toEndOf="@+id/textView2"app:layout_constraintHorizontal_bias="1.0"app:layout_constraintStart_toEndOf="@+id/imageView" /></androidx.constraintlayout.widget.ConstraintLayout>

file.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-pathname="pick_photos"path="."></external-path>
</paths>

FragmentList

package com.suke.recyclerstudentsqlitephone;import android.Manifest;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;public class FragmentList extends Fragment {//控制台打印提示private final String TagCreate = "create";private final String TagDelete = "delete";//创建学生信息列表private List<Student> dataStu = new ArrayList<>();private Student student;//学号、姓名、手机号private EditText editId;private EditText editName;private EditText editTel;//头像private ImageView imageView;//添加学生信息按钮private Button btnCommit;//添加通讯录联系人信息private Button btnGetPhoneInfo;//RecyclerView的工具类private StudentAdapter studentAdapter;//学生信息视图列表private RecyclerView rcvStu;//数据库读写SQLiteDatabase readableDatabase;SQLiteDatabase writableDatabase;ContentValues values;//拍照、相册public static final int TAKE_PHOTO = 1;public static final int CHOOSE_PHOTO = 2;//头像地址private Uri imageUri;//头像转字节存储private byte[] in;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setRetainInstance(true);check();}//检查获取通讯录权限private void check() {//判断是否有权限if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_CONTACTS}, 201);} else {return;}}@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {//1.获取fragment_list视图View view = inflater.inflate(R.layout.fragment_list, container, false);//2.初始化视图initView(view);//3.初始化数据initData();//4.返回视图return view;}//刷新学生列表@SuppressLint("Range")public void refreshList() {//清空学生列表dataStu.clear();//cursor游标读取数据库内容Cursor cursor = readableDatabase.query("students", null, null, null, null, null, null);//游标获取学生学号、姓名、手机号、图片号while (cursor.moveToNext()) {@SuppressLint("Range") String stu_id = cursor.getString(cursor.getColumnIndex("stu_id"));@SuppressLint("Range") String stu_name = cursor.getString(cursor.getColumnIndex("stu_name"));@SuppressLint("Range") String stu_tel = cursor.getString(cursor.getColumnIndex("stu_tel"));@SuppressLint("Range") byte[] stu_image = cursor.getBlob(cursor.getColumnIndex("stu_image"));dataStu.add(new Student(stu_id, stu_name, stu_tel, stu_image));}}//2.初始化视图private void initView(View view) {editId = view.findViewById(R.id.edit_id);editName = view.findViewById(R.id.edit_name);editTel = view.findViewById(R.id.edit_tel);btnCommit = view.findViewById(R.id.btn_commit);imageView = view.findViewById(R.id.image_stu);rcvStu = view.findViewById(R.id.rcv_stu);btnGetPhoneInfo = view.findViewById(R.id.btn_getPhone);//设置 recyclerview 显示布局LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());rcvStu.setLayoutManager(linearLayoutManager);}//3.初始化数据private void initData() {//创建数据库 Student.dbSQLiteOpenHelper helper = MySqlite.getInstance(getContext());//只有执行下面才能创建出数据库和表 studentswritableDatabase = helper.getWritableDatabase();readableDatabase = helper.getReadableDatabase();//刷新学生列表获取学生数据库信息refreshList();//获取通讯录联系人信息btnGetPhoneInfo.setOnClickListener(v -> {PhoneInfo phoneInfo = new PhoneInfo(getContext());dataStu = phoneInfo.getPhone();String id = editId.getText().toString();//根据id序号查找联系人信息并写入文本框中for (Student s : dataStu) {if (id.equals(s.getSno())) {editName.setText(s.getSname());editTel.setText(s.getStele());} else {Toast.makeText(getContext(), "学号错误!无法找到该联系人", Toast.LENGTH_SHORT).show();}}});//拍照或相册选择头像imageView.setOnClickListener(v -> {final String[] items = new String[]{"拍照", "相册"};AlertDialog.Builder builder = new AlertDialog.Builder(getContext());builder.setTitle("请选择头像获取方式:");builder.setItems(items, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int which) {switch (items[which]) {case "拍照":takePhoto();break;case "相册":choosePhoto();break;}}});builder.create().show();});//添加学生信息(lambda表达式)btnCommit.setOnClickListener(v -> {String id = editId.getText().toString();String name = editName.getText().toString();String tel = editTel.getText().toString();//向数据表 添加学生信息values = new ContentValues();values.put("stu_id", id);values.put("stu_name", name);values.put("stu_tel", tel);values.put("stu_image", in);if (writableDatabase.insert("students", null, values) > 0) {refreshList();Toast.makeText(getContext(), "创建成功!", Toast.LENGTH_SHORT).show();Log.e(TagCreate, "学生创建成功");//将添加学生信息处置空editId.setText("");editName.setText("");editTel.setText("");studentAdapter.notifyDataSetChanged();}});studentAdapter = new StudentAdapter();rcvStu.setAdapter(studentAdapter);}//拍照获取头像public void takePhoto() {File outputImage = new File(getContext().getExternalCacheDir(), "output_image.jpg");try {if (outputImage.exists()) {outputImage.delete();}} catch (Exception e) {e.printStackTrace();}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {imageUri = FileProvider.getUriForFile(getContext(), "com.suke.pickphoto.fileprovider", outputImage);} else {imageUri = Uri.fromFile(outputImage);}Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);startActivityForResult(intent, TAKE_PHOTO);}//相册获取头像public void choosePhoto() {Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(intent, CHOOSE_PHOTO);}private byte[] getImg(Bitmap bitmap) {ByteArrayOutputStream baos = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);return baos.toByteArray();}@Overridepublic void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == getActivity().RESULT_OK) {switch (requestCode) {case TAKE_PHOTO:try {Bitmap bitmap = BitmapFactory.decodeStream(getContext().getContentResolver().openInputStream(imageUri));imageView.setImageBitmap(bitmap);in = getImg(bitmap);} catch (FileNotFoundException e) {e.printStackTrace();}break;case CHOOSE_PHOTO:Uri uri = data.getData();Cursor c = getContext().getContentResolver().query(uri, new String[]{MediaStore.Images.Media.DATA}, null, null, null);if (c != null) {c.moveToFirst();@SuppressLint("Range")String path = c.getString(c.getColumnIndex(MediaStore.Images.Media.DATA));Bitmap bitmap = BitmapFactory.decodeFile(path);imageView.setImageBitmap(bitmap);in = getImg(bitmap);}break;}}}private class StudentAdapter extends RecyclerView.Adapter<StudentAdapter.MyViewHolder> {@NonNull@Overridepublic MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = View.inflate(getContext(), R.layout.list_item_layout, null);return new MyViewHolder(view);}@Overridepublic void onBindViewHolder(@NonNull MyViewHolder holder, @SuppressLint("RecyclerView") int position) {holder.tvId.setText(dataStu.get(position).getSno());holder.tvName.setText(dataStu.get(position).getSname());holder.tvTel.setText(dataStu.get(position).getStele());//字节码头像转换获取byte[] in = dataStu.get(position).getSimage();Bitmap bitmap = BitmapFactory.decodeByteArray(in, 0, in.length);holder.imageView.setImageBitmap(bitmap);//拨打电话(隐式调用)holder.btnCall.setOnClickListener(v -> {String tel = dataStu.get(position).getStele();//传入两个参数(一个是拨号盘,一个是电话号)Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + tel));//实例化之后startActivity执行startActivity(intent);});//删除学生信息holder.btnDelete.setOnClickListener(v -> {AlertDialog alertDialog = new AlertDialog.Builder(getContext()).create();alertDialog.setIcon(holder.imageView.getDrawable());alertDialog.setTitle("联系人: " + holder.tvName.getText());alertDialog.setMessage("学号:" + holder.tvId.getText() + "\n手机号: " + holder.tvTel.getText());alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "否", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {Toast.makeText(getContext(), "你选择了否!", Toast.LENGTH_SHORT).show();}});alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "是", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {//数据库删除学生信息writableDatabase.delete("students", "stu_id=?", new String[]{(dataStu.get(position).getSno())});Toast.makeText(getContext(), "删除成功!", Toast.LENGTH_SHORT).show();dataStu.remove(position);studentAdapter.notifyDataSetChanged();Log.e(TagDelete, "学生已删除");}});alertDialog.show();});}//RecyclerView视图列表展示数量@Overridepublic int getItemCount() {//判断是否为空return dataStu == null ? 0 : dataStu.size();}public class MyViewHolder extends RecyclerView.ViewHolder {//学号、姓名、手机号private TextView tvId;private TextView tvName;private TextView tvTel;//学生头像private ImageView imageView;//拨打电话private Button btnCall;//删除学生private ImageButton btnDelete;public MyViewHolder(@NonNull View itemView) {super(itemView);tvId = itemView.findViewById(R.id.tv_id);tvName = itemView.findViewById(R.id.tv_name);tvTel = itemView.findViewById(R.id.tv_tel);imageView = itemView.findViewById(R.id.imageView);btnCall = itemView.findViewById(R.id.btn_call);btnDelete = itemView.findViewById(R.id.btn_delete);}}}
}

Getpermission

package com.suke.recyclerstudentsqlitephone;import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;public class Getpermission {public static final int REQUEST_CODE = 5;private static final String[] permission = new String[]{Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,};public static void requestPermission(Activity activity){//判断是否有权限if (ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED){//索取权限ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.READ_CONTACTS},1);}else {//说明已经有权限了,无需再获取}if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_CONTACTS)!= PackageManager.PERMISSION_GRANTED){//索取权限ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.WRITE_CONTACTS},1);}else {//说明已经有权限了,无需再获取}}public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {if (requestCode==1){if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){//用户点了同意获取权限}else{//用户点了拒绝获取权限}}}public static boolean isPermissionGranted(Activity activity) {if (Build.VERSION.SDK_INT >= 23) {for (int i = 0; i < permission.length; i++) {int checkPermission = ContextCompat.checkSelfPermission(activity, permission[i]);if (checkPermission != PackageManager.PERMISSION_GRANTED) {return false;}}}return true;}public static boolean checkPermission(Activity activity) {if (isPermissionGranted(activity)) {return true;} else {ActivityCompat.requestPermissions(activity, permission, REQUEST_CODE);return false;}}
}

MainActivity

package com.suke.recyclerstudentsqlitephone;import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);FragmentManager fm = getSupportFragmentManager();Fragment fragment = fm.findFragmentById(R.id.fragment_list);if (fragment == null) {fragment = new FragmentList();fm.beginTransaction().add(R.id.fragment_list, fragment).commit();}}@Overrideprotected void onStart() {super.onStart();Getpermission.checkPermission(this);}
}

MySqlite


package com.suke.recyclerstudentsqlitephone;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;import androidx.annotation.Nullable;/** MySqlite 工具类  单例模式(1.构造函数私有化  2.对外提供函数)* */public class MySqlite extends SQLiteOpenHelper {//2.对外提供函数private static SQLiteOpenHelper mInstance;public static synchronized SQLiteOpenHelper getInstance(Context context) {if (mInstance == null) {mInstance = new MySqlite(context, "Student.db", null, 1);}return mInstance;}//1.构造函数私有化public MySqlite(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}/** 数据初始化时使用的* 创建表   表数据初始化  数据库第一次创建的时候调用* 第二次发现表已存在 就不会重复创建了: 意味着此函数只会执行一次* */@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {String sql = "CREATE TABLE IF NOT EXISTS students (" +"stu_id TEXT PRIMARY KEY, " +"stu_name TEXT, " +"stu_tel TEXT," +"stu_image text" +")";sqLiteDatabase.execSQL(sql);}//数据库升级用的@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}
}

PhoneInfo

package com.suke.recyclerstudentsqlitephone;import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;import java.util.ArrayList;
import java.util.List;public class PhoneInfo {//序号public final static String ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID;//号码public final static String NUM = ContactsContract.CommonDataKinds.Phone.NUMBER;//联系人姓名public final static String NAME = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME;//上下文对象private Context context;//联系人提供者的uriprivate Uri phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;public PhoneInfo(Context context) {this.context = context;}//获取所有联系人public List<Student> getPhone() {List<Student> dataStu = new ArrayList<>();ContentResolver cr = context.getContentResolver();Cursor cursor = cr.query(phoneUri, new String[]{ID, NUM, NAME}, null, null, null);while (cursor.moveToNext()) {@SuppressLint("Range") Student student = new Student(cursor.getString(cursor.getColumnIndex(ID)), cursor.getString(cursor.getColumnIndex(NAME)), cursor.getString(cursor.getColumnIndex(NUM)));dataStu.add(student);}return dataStu;}
}

Student

package com.suke.recyclerstudentsqlitephone;import android.graphics.Bitmap;public class Student {private String Sno;private String Sname;private String Stele;private byte[] Simage;public Student() {}public Student(String sno, String sname, String stele) {Sno = sno;Sname = sname;Stele = stele;}public Student(String sno, String sname, String stele, byte[] simage) {Sno = sno;Sname = sname;Stele = stele;Simage = simage;}public String getSno() {return Sno;}public void setSno(String sno) {Sno = sno;}public String getSname() {return Sname;}public void setSname(String sname) {Sname = sname;}public String getStele() {return Stele;}public void setStele(String stele) {Stele = stele;}public byte[] getSimage() {return Simage;}public void setSimage(byte[] simage) {Simage = simage;}
}

五、运行结果

实验七 Android Studio Intent相机图库读取照片【班级名单列表视图03】相关推荐

  1. (复习)android 调用系统相机 图库 裁剪-图片上传-客服端-服务器

    引用转载http://www.cnblogs.com/eyu8874521/archive/2012/07/20/2600697.html 效果: 客服端代码: package com.cn.lxz. ...

  2. 《移动项目实践》实验报告——Android Studio环境搭建

    源代码:https://gitee.com/shentuzhigang/mini-project/tree/master/android-helloworld 实验内容 安装JAVA JDK,并配置环 ...

  3. Android studio设置相机权限,如何强制将“android.permission.CAMERA”权限添加到Codename中的清单中...

    我试图在Codename One中显示后置摄像头的实时预览.我使用原生界面(我首先针对的是Android). 为了让我的应用程序能够使用相机而不会弄乱构建提示,我在主窗体中添加了以下行: if (Ca ...

  4. 安卓移动开发实验:Android Studio设计微信界面

    一.实验的目的 通过使用Android Studio的Fragment和layout,来实现简单的微信界面切换. 二.app的功能 能够通过应用底部的bottom来实现四个页面的来回切换. 三.实验过 ...

  5. android autolink识别错误,android - autolink窃取ontouch事件,从而反馈触摸列表视图行无效 - 堆栈内存溢出...

    我有一个listview . 并且行布局中包含很少的布局. 在行布局中,我有一个TextView ,我想在其上启用自动链接当我启用自动链接时,链接工作正常但我们点击列表行时得到的反馈不再有效. 在行布 ...

  6. Android Studio Intent使用(显式、隐式)

    https://blog.csdn.net/u012005313/article/details/47006689 使用Intent能够使程序在不同活动中跳转,意及能够使用不同界面.Intent用法分 ...

  7. Android studio Intent的使用

    1.为什么要使用Intent? Intent 是 Android 程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组 件想要执行的动作,还可以在不同组件之间传递数据.Intent 一般可被用 ...

  8. android studio读写txt,Android Studio从.txt文件读取/写入,保存路径?

    我有这2种方法在我的MainActivity(只是测试,看看如何读取和/写入到文件中的作品): public void WriteBtn() { // add-write text into file ...

  9. Android studio实验体会,Android Studio 使用心得体会

    Andorid 开发 在android 最初学习阶段,通常会遇到很多问题,Andorid 学习过程中知识点繁多,难以熟练的应用,不经过很长一段时间很难以熟练地运用自己所学的知识 其实Andorid 并 ...

最新文章

  1. 雷达装置 (POJ 1328/ codevs 2625)题解
  2. 启动物料帐后不可更改物料价格的处理方法
  3. Spinner 学习笔记
  4. LINUX 邮件服务器qmail 架设
  5. 高效开发Android App的10个建议
  6. 导出excel、word、csv文件方法汇总
  7. shell unexpected operator
  8. 小米路由器3G刷入OpenWrt
  9. 1653 藏头诗
  10. 有一种神奇的性格叫——INTJ
  11. ERR_NAME_NOT_RESOLVED错误的解决方法
  12. 2019年Gartner数据中心备份和恢复解决方案魔力象限解读
  13. JavaScript的字符串去空格
  14. FPGA AD0809 Verilog implement
  15. C++双人战争游戏(机房娱乐)
  16. java修改图章图片_Java处理PDF图章的方法示例(代码)
  17. 宣化上人: “肉字里边两个人, 里边罩着外边人; 众生还吃众生肉, 仔细思量人吃人。”
  18. html计算年龄代码,JavaScript简单计算人的年龄示例
  19. matlab如何下载a股数据,matlab如何下载a股数据,股票数据爬虫代码
  20. 1000Mbps网络传输介质与有效传输距离

热门文章

  1. 【mmaction2 slowfast 行为分析(商用级别)】总目录
  2. 图书馆系统c语言作业,C语言图书馆管理系统课程设计报告
  3. 一张图片换脸,三星AI最强换脸模型
  4. 10-135 5-1 查询销售便携式电脑但不销售PC的厂商
  5. 【问题篇】免费下载使用RDM
  6. 30天搞定spark源码系列-RDD番外篇-shuffledRDD
  7. 格式工厂v5.11.0 绿色纯净版,万能的多媒体格式转换器
  8. mysql映射mapper_这下够清楚了吧!详解Mybatis的Mapper映射文件
  9. oracle时间相减
  10. JS下拉列表动态收缩与展开