diff --git a/doc/小米便签开源代码的泛读报告.docx b/doc/小米便签开源代码的泛读报告.docx index 8460a7c..e0a7d90 100644 Binary files a/doc/小米便签开源代码的泛读报告.docx and b/doc/小米便签开源代码的泛读报告.docx differ diff --git a/src/FaceRecognition/.gitignore b/src/FaceRecognition/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/src/FaceRecognition/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/src/FaceRecognition/.idea/.gitignore b/src/FaceRecognition/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/src/FaceRecognition/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/src/FaceRecognition/.idea/compiler.xml b/src/FaceRecognition/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/src/FaceRecognition/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/FaceRecognition/.idea/gradle.xml b/src/FaceRecognition/.idea/gradle.xml new file mode 100644 index 0000000..5cd135a --- /dev/null +++ b/src/FaceRecognition/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/src/FaceRecognition/.idea/jarRepositories.xml b/src/FaceRecognition/.idea/jarRepositories.xml new file mode 100644 index 0000000..0380d8d --- /dev/null +++ b/src/FaceRecognition/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/FaceRecognition/.idea/misc.xml b/src/FaceRecognition/.idea/misc.xml new file mode 100644 index 0000000..6199cc2 --- /dev/null +++ b/src/FaceRecognition/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/src/FaceRecognition/.idea/runConfigurations.xml b/src/FaceRecognition/.idea/runConfigurations.xml new file mode 100644 index 0000000..797acea --- /dev/null +++ b/src/FaceRecognition/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/src/FaceRecognition/app/.gitignore b/src/FaceRecognition/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/src/FaceRecognition/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/src/FaceRecognition/app/build.gradle b/src/FaceRecognition/app/build.gradle new file mode 100644 index 0000000..1fe9969 --- /dev/null +++ b/src/FaceRecognition/app/build.gradle @@ -0,0 +1,41 @@ +plugins { + id 'com.android.application' +} + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.2" + + defaultConfig { + applicationId "com.example.cameraalbumtest" + minSdkVersion 19 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.2.1' + implementation 'androidx.constraintlayout:constraintlayout:2.0.1' + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' + + +} \ No newline at end of file diff --git a/src/FaceRecognition/app/proguard-rules.pro b/src/FaceRecognition/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/src/FaceRecognition/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/src/FaceRecognition/app/src/androidTest/java/com/example/cameraalbumtest/ExampleInstrumentedTest.java b/src/FaceRecognition/app/src/androidTest/java/com/example/cameraalbumtest/ExampleInstrumentedTest.java new file mode 100644 index 0000000..46df79d --- /dev/null +++ b/src/FaceRecognition/app/src/androidTest/java/com/example/cameraalbumtest/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.cameraalbumtest; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.example.cameraalbumtest", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/src/FaceRecognition/app/src/main/AndroidManifest.xml b/src/FaceRecognition/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..28d46b0 --- /dev/null +++ b/src/FaceRecognition/app/src/main/AndroidManifest.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/FaceRecognition/app/src/main/java/com/example/cameraalbumtest/CameraActivity.java b/src/FaceRecognition/app/src/main/java/com/example/cameraalbumtest/CameraActivity.java new file mode 100644 index 0000000..cdc0231 --- /dev/null +++ b/src/FaceRecognition/app/src/main/java/com/example/cameraalbumtest/CameraActivity.java @@ -0,0 +1,153 @@ +package com.example.cameraalbumtest; + +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.hardware.Camera; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.util.Log; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.View; +import android.widget.Button; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.FileProvider; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +public class CameraActivity extends AppCompatActivity implements SurfaceHolder.Callback { + private Camera mCamera; + private SurfaceView mSurfaceView; + private SurfaceHolder mSurfaceHolder; + private Uri imageUri; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.camera); + mSurfaceView = findViewById(R.id.surfaceView); + mSurfaceHolder = mSurfaceView.getHolder(); + mSurfaceHolder.addCallback(this); + + Button takePhoto = (Button) findViewById(R.id.take_photo); + takePhoto.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + takePhoto(); + } + }); + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + // 在surfaceCreated回调中打开相机 + openCamera(); + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + // 在surfaceChanged回调中设置相机参数和开始预览 + setupCamera(width, height); + startPreview(); + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + // 在surfaceDestroyed回调中释放相机资源 + releaseCamera(); + } + + private void openCamera() { + try { + mCamera = Camera.open(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setupCamera(int width, int height) { + if (mCamera != null) { + try { + Camera.Parameters parameters = mCamera.getParameters(); + // 设置相机参数,例如对焦模式、预览大小等 + // ... + mCamera.setParameters(parameters); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + private void startPreview() { + if (mCamera != null && mSurfaceHolder.getSurface() != null) { + try { + mCamera.setPreviewDisplay(mSurfaceHolder); + mCamera.startPreview(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private void releaseCamera() { + if (mCamera != null) { + mCamera.stopPreview(); + mCamera.release(); + mCamera = null; + } + } + private void takePhoto() { + if (mCamera != null) { + mCamera.takePicture(null, null, new Camera.PictureCallback() { + @Override + public void onPictureTaken(byte[] data, Camera camera) { + // 在这里处理拍照后的照片数据 + + savePhoto(data); + startPreview(); // 拍照完成后重新启动预览 + } + }); + } + } + + private void savePhoto(byte[] data) { + OutputStream outputStream = null; + try { + File cacheDir = getCacheDir(); // 获取应用的缓存目录 + File imagePath = new File(cacheDir, "output_image.jpg"); // 在缓存目录下创建文件 + imageUri = Uri.fromFile(imagePath); // 将文件路径转换为Uri + + Log.d("path",imageUri.toString()); + // 创建一个文件输出流,指定保存路径 + outputStream = new FileOutputStream(imageUri.getPath()); + // 将字节数组写入文件输出流 + outputStream.write(data); + // 刷新输出流 + outputStream.flush(); + // 保存成功,可以进行相应的提示或其他处理 + Toast.makeText(this, "照片保存成功", Toast.LENGTH_SHORT).show(); + } catch (IOException e) { + e.printStackTrace(); + // 保存失败,可以进行相应的提示或其他处理 + Toast.makeText(this, "照片保存失败", Toast.LENGTH_SHORT).show(); + } finally { + // 关闭输出流 + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + +} + diff --git a/src/FaceRecognition/app/src/main/java/com/example/cameraalbumtest/FaceRecognition.java b/src/FaceRecognition/app/src/main/java/com/example/cameraalbumtest/FaceRecognition.java new file mode 100644 index 0000000..43a1863 --- /dev/null +++ b/src/FaceRecognition/app/src/main/java/com/example/cameraalbumtest/FaceRecognition.java @@ -0,0 +1,22 @@ +package com.example.cameraalbumtest; + +import android.content.Context; +import android.graphics.Bitmap; +import android.media.FaceDetector; + +public class FaceRecognition { + private static final int MAX_FACES = 1; + + public static int countFaces(Bitmap bitmap) { + if (bitmap == null) { + return 0; + } + + int width = bitmap.getWidth(); + int height = bitmap.getHeight(); + FaceDetector detector = new FaceDetector(width, height, MAX_FACES); + FaceDetector.Face[] faces = new FaceDetector.Face[MAX_FACES]; + int numFaces = detector.findFaces(bitmap, faces); + return numFaces; + } +} diff --git a/src/FaceRecognition/app/src/main/java/com/example/cameraalbumtest/MainActivity.java b/src/FaceRecognition/app/src/main/java/com/example/cameraalbumtest/MainActivity.java new file mode 100644 index 0000000..38a0c0a --- /dev/null +++ b/src/FaceRecognition/app/src/main/java/com/example/cameraalbumtest/MainActivity.java @@ -0,0 +1,73 @@ +package com.example.cameraalbumtest; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.core.content.FileProvider; + +import android.Manifest; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.hardware.Camera; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.provider.MediaStore; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.Toast; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; + + +public class MainActivity extends AppCompatActivity { + private static final int REQUEST_CAMERA_PERMISSION = 1; + private Uri imageUri; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + Button takePhoto = (Button) findViewById(R.id.start); + takePhoto.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + //相机权限 + requestCameraPermission(); + + Intent intent = new Intent(MainActivity.this, CameraActivity.class); + startActivity(intent); + } + }); + } + private void requestCameraPermission() { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) + != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.CAMERA}, + REQUEST_CAMERA_PERMISSION); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + if (requestCode == REQUEST_CAMERA_PERMISSION) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + // 用户授予了相机权限 + } else { + // 用户拒绝了相机权限 + Toast.makeText(this, "相机权限被拒绝", Toast.LENGTH_SHORT).show(); + } + } + } +} diff --git a/src/FaceRecognition/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/src/FaceRecognition/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/src/FaceRecognition/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/FaceRecognition/app/src/main/res/drawable/ic_launcher_background.xml b/src/FaceRecognition/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/src/FaceRecognition/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/FaceRecognition/app/src/main/res/layout/activity_main.xml b/src/FaceRecognition/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..082a5b2 --- /dev/null +++ b/src/FaceRecognition/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,11 @@ + + +