diff --git a/students/soft1714080902205/app/src/main/AndroidManifest.xml b/students/soft1714080902205/app/src/main/AndroidManifest.xml
index b014c07d5..cd3f20e9f 100644
--- a/students/soft1714080902205/app/src/main/AndroidManifest.xml
+++ b/students/soft1714080902205/app/src/main/AndroidManifest.xml
@@ -4,6 +4,11 @@
+
+
+
+
+
-
+
+
+
+
+
+
+
@@ -36,7 +47,16 @@
+ android:required="false" />
+
+
+
\ No newline at end of file
diff --git a/students/soft1714080902205/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902205/person/HeadActivity.java b/students/soft1714080902205/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902205/person/HeadActivity.java
new file mode 100644
index 000000000..357f40c93
--- /dev/null
+++ b/students/soft1714080902205/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902205/person/HeadActivity.java
@@ -0,0 +1,260 @@
+package edu.hzuapps.androidlabs.soft1714080902205.person;
+
+
+import android.Manifest;
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.provider.MediaStore;
+import android.support.annotation.NonNull;
+import android.support.v4.content.FileProvider;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatActivity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.List;
+
+import edu.hzuapps.androidlabs.soft1714080902205.R;
+import edu.hzuapps.androidlabs.soft1714080902205.Soft1714080902205Activity;
+import pub.devrel.easypermissions.AppSettingsDialog;
+import pub.devrel.easypermissions.EasyPermissions;
+
+public class HeadActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks{
+
+ private Context mContext;
+ private AlertDialog profilePictureDialog;
+ private static final String PERMISSION_CAMERA = Manifest.permission.CAMERA;
+ private static final String PERMISSION_WRITE = Manifest.permission.WRITE_EXTERNAL_STORAGE;
+ private static final int REQUEST_PERMISSION_CAMERA = 0x001;
+ private static final int REQUEST_PERMISSION_WRITE = 0x002;
+ private static final int CROP_REQUEST_CODE = 0x003;
+
+ private ImageView ivAvatar;
+
+ /**
+ * 文件相关
+ */
+ private File captureFile;
+ private File rootFile;
+ private File cropFile;
+
+ private String path;
+ private String filepath;
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ setContentView(R.layout.head_activity);
+ super.onCreate(savedInstanceState);
+ ivAvatar = findViewById(R.id.iv_avatar);
+
+ //加载Activity时读取sdcard的图片
+ path=Environment.getExternalStorageDirectory().getAbsolutePath() + "/TakePhotoPic";
+ filepath=path+"/avatar.jpg";
+ File file=new File(filepath);
+ if(file.exists()){
+ Bitmap bm=BitmapFactory.decodeFile(filepath);
+ ivAvatar.setImageBitmap(bm);
+ }else{
+ Toast.makeText(HeadActivity.this,"未成功读取图片",Toast.LENGTH_SHORT).show();
+ }
+
+
+ mContext = this;
+
+
+
+ rootFile = new File(MyConstant.PIC_PATH);
+ if (!rootFile.exists()) {
+ rootFile.mkdirs();
+ }
+
+ Button btn_return=(Button)findViewById(R.id.btn_return);
+ btn_return.setOnClickListener(new View.OnClickListener(){
+
+ public void onClick(View v) {
+ Intent intent = new Intent(HeadActivity.this, Soft1714080902205Activity.class);
+ startActivity(intent);
+ }
+ });
+ }
+
+ public void btnClick(View view) {
+
+ if (profilePictureDialog == null) {
+ @SuppressLint("InflateParams") View rootView = LayoutInflater.from(this).inflate(R.layout.item_profile_picture, null);
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ rootView.findViewById(R.id.tv_take_photo).setOnClickListener(onTakePhotoListener);
+ rootView.findViewById(R.id.tv_choose_photo).setOnClickListener(onChoosePhotoListener);
+ builder.setView(rootView);
+ profilePictureDialog = builder.create();
+ profilePictureDialog.show();
+ } else {
+ profilePictureDialog.show();
+ }
+ }
+
+ private void dismissProfilePictureDialog() {
+ if (profilePictureDialog != null && profilePictureDialog.isShowing()) {
+ profilePictureDialog.dismiss();
+ }
+ }
+
+ private View.OnClickListener onTakePhotoListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ dismissProfilePictureDialog();
+ if (EasyPermissions.hasPermissions(mContext, PERMISSION_CAMERA, PERMISSION_WRITE)) {
+ takePhoto();
+ } else {
+ EasyPermissions.requestPermissions(HeadActivity.this, "need camera permission", REQUEST_PERMISSION_CAMERA, PERMISSION_CAMERA, PERMISSION_WRITE);
+ }
+ }
+ };
+
+ //拍照
+ private void takePhoto() {
+ //用于保存调用相机拍照后所生成的文件
+ if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+ return;
+ }
+ captureFile = new File(rootFile, "temp.jpg");
+ //跳转到调用系统相机
+ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
+ //判断版本 如果在Android7.0以上,使用FileProvider获取Uri
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+ Uri contentUri = FileProvider.getUriForFile(HeadActivity.this, "edu.hzuapps.androidlabs.soft1714080902205.person.fileprovider",captureFile);
+ intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);
+ } else {
+ //否则使用Uri.fromFile(file)方法获取Uri
+ intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(captureFile));
+ }
+ startActivityForResult(intent, REQUEST_PERMISSION_CAMERA);
+ }
+
+ private View.OnClickListener onChoosePhotoListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ dismissProfilePictureDialog();
+ if (EasyPermissions.hasPermissions(mContext, PERMISSION_WRITE)) {
+ choosePhoto();
+ } else {
+ EasyPermissions.requestPermissions(HeadActivity.this, "need camera permission", REQUEST_PERMISSION_WRITE, PERMISSION_WRITE);
+ }
+ }
+ };
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
+ }
+
+
+ //从相册选择
+ private void choosePhoto() {
+ Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
+ photoPickerIntent.setType("image/*");
+ startActivityForResult(photoPickerIntent, REQUEST_PERMISSION_WRITE);
+ }
+
+ @Override
+ public void onPermissionsGranted(int requestCode, @NonNull List perms) {
+ if (requestCode == REQUEST_PERMISSION_CAMERA) {
+ takePhoto();
+ } else if (requestCode == REQUEST_PERMISSION_WRITE) {
+ choosePhoto();
+ }
+ }
+
+ /**
+ * 裁剪图片
+ */
+ private void cropPhoto(Uri uri) {
+ cropFile = new File(rootFile, "avatar.jpg");
+ Intent intent = new Intent("com.android.camera.action.CROP");
+ intent.setDataAndType(uri, "image/*");
+ intent.putExtra("crop", "true");
+ intent.putExtra("aspectX", 1);
+ intent.putExtra("aspectY", 1);
+ intent.putExtra("outputX", 300);
+ intent.putExtra("outputY", 300);
+ intent.putExtra("return-data", false);
+ intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cropFile));
+ intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
+ intent.putExtra("noFaceDetection", true);
+ intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+ intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ startActivityForResult(intent, CROP_REQUEST_CODE);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (resultCode == RESULT_OK) {
+ switch (requestCode) {
+ case REQUEST_PERMISSION_CAMERA:
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ Uri contentUri = FileProvider.getUriForFile(HeadActivity.this, "edu.hzuapps.androidlabs.soft1714080902205.person.fileprovider",captureFile);
+ cropPhoto(contentUri);
+ } else {
+ cropPhoto(Uri.fromFile(captureFile));
+ }
+ break;
+ case REQUEST_PERMISSION_WRITE:
+ cropPhoto(data.getData());
+ break;
+ case CROP_REQUEST_CODE:
+ saveImage(cropFile.getAbsolutePath());
+ ivAvatar.setImageBitmap(BitmapFactory.decodeFile(cropFile.getAbsolutePath()));
+ break;
+ default:
+ break;
+ }
+ }
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+
+
+ /**
+ * @param path
+ * @return
+ */
+ public String saveImage(String path) {
+ if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+ return null;
+ }
+ Bitmap bitmap = BitmapFactory.decodeFile(path);
+ try {
+ FileOutputStream fos = new FileOutputStream(cropFile);
+ bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
+ fos.flush();
+ fos.close();
+ return cropFile.getAbsolutePath();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+
+ @Override
+ public void onPermissionsDenied(int requestCode, @NonNull List perms) {
+ if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
+ new AppSettingsDialog.Builder(this).build().show();
+ }
+ }
+}
\ No newline at end of file
diff --git a/students/soft1714080902205/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902205/person/MyConstant.java b/students/soft1714080902205/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902205/person/MyConstant.java
new file mode 100644
index 000000000..4ad54aedb
--- /dev/null
+++ b/students/soft1714080902205/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902205/person/MyConstant.java
@@ -0,0 +1,9 @@
+package edu.hzuapps.androidlabs.soft1714080902205.person;
+
+import android.os.Environment;
+
+public class MyConstant {
+
+ public static final String PIC_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/TakePhotoPic";
+}
+
diff --git a/students/soft1714080902205/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902205/person/TakePhotoApplication.java b/students/soft1714080902205/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902205/person/TakePhotoApplication.java
new file mode 100644
index 000000000..3f84fc1f1
--- /dev/null
+++ b/students/soft1714080902205/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902205/person/TakePhotoApplication.java
@@ -0,0 +1,85 @@
+package edu.hzuapps.androidlabs.soft1714080902205.person;
+
+import android.app.Activity;
+import android.app.Application;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.View;
+import android.widget.TextView;
+
+import edu.hzuapps.androidlabs.soft1714080902205.R;
+
+
+public class TakePhotoApplication extends Application {
+
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
+ @Override
+ public void onActivityCreated(final Activity activity, Bundle savedInstanceState) {
+ //这里全局给Activity设置toolbar和title,你想象力有多丰富,这里就有多强大,以前放到BaseActivity的操作都可以放到这里
+ if (activity.findViewById(R.id.toolbar) != null) {
+ //找到 Toolbar 并且替换 Actionbar
+ if (activity instanceof AppCompatActivity) {
+ ((AppCompatActivity) activity).setSupportActionBar((Toolbar) activity.findViewById(R.id.toolbar));
+ ((AppCompatActivity) activity).getSupportActionBar().setDisplayShowTitleEnabled(false);
+ ((AppCompatActivity) activity).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ ((Toolbar) activity.findViewById(R.id.toolbar)).setNavigationOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ activity.finish();
+ }
+ });
+
+ } else {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ activity.setActionBar((android.widget.Toolbar) activity.findViewById(R.id.toolbar));
+ activity.getActionBar().setDisplayShowTitleEnabled(false);
+ }
+ }
+ }
+ if (activity.findViewById(R.id.toolbar_title) != null) {
+ //找到 Toolbar 的标题栏并设置标题名
+ ((TextView) activity.findViewById(R.id.toolbar_title)).setText(activity.getTitle());
+
+
+ }
+ }
+
+ @Override
+ public void onActivityStarted(Activity activity) {
+
+ }
+
+ @Override
+ public void onActivityResumed(Activity activity) {
+
+ }
+
+ @Override
+ public void onActivityPaused(Activity activity) {
+
+ }
+
+ @Override
+ public void onActivityStopped(Activity activity) {
+
+ }
+
+ @Override
+ public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
+
+ }
+
+ @Override
+ public void onActivityDestroyed(Activity activity) {
+
+ }
+ });
+
+ }
+}
diff --git a/students/soft1714080902205/app/src/main/res/layout/head_activity.xml b/students/soft1714080902205/app/src/main/res/layout/head_activity.xml
new file mode 100644
index 000000000..ee7c20014
--- /dev/null
+++ b/students/soft1714080902205/app/src/main/res/layout/head_activity.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/students/soft1714080902205/app/src/main/res/layout/item_profile_picture.xml b/students/soft1714080902205/app/src/main/res/layout/item_profile_picture.xml
new file mode 100644
index 000000000..347f7adbe
--- /dev/null
+++ b/students/soft1714080902205/app/src/main/res/layout/item_profile_picture.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/students/soft1714080902205/app/src/main/res/layout/toolbar_layout.xml b/students/soft1714080902205/app/src/main/res/layout/toolbar_layout.xml
new file mode 100644
index 000000000..e8f0cd9ad
--- /dev/null
+++ b/students/soft1714080902205/app/src/main/res/layout/toolbar_layout.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
diff --git a/students/soft1714080902205/app/src/main/res/xml/file_paths.xml b/students/soft1714080902205/app/src/main/res/xml/file_paths.xml
new file mode 100644
index 000000000..6730949d0
--- /dev/null
+++ b/students/soft1714080902205/app/src/main/res/xml/file_paths.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file