commit
8dc4ba1226
@ -0,0 +1,2 @@
|
|||||||
|
# MayWeSeeYouAgian
|
||||||
|
|
@ -0,0 +1,37 @@
|
|||||||
|
apply plugin: 'com.android.application'
|
||||||
|
|
||||||
|
android {
|
||||||
|
compileSdkVersion 33
|
||||||
|
buildToolsVersion "33.0.2"
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
applicationId "net.micode.notes"
|
||||||
|
minSdkVersion 33
|
||||||
|
//noinspection ExpiredTargetSdkVersion
|
||||||
|
targetSdkVersion 33
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation group: 'org.apache.httpcomponents.client5', name: 'httpclient5', version: '5.2.1'
|
||||||
|
implementation group: 'androidx.appcompat', name: 'appcompat', version: '1.6.0'
|
||||||
|
implementation 'com.google.android.material:material:1.7.0'
|
||||||
|
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
||||||
|
implementation 'com.android.support:support-annotations:28.0.0'
|
||||||
|
testImplementation 'junit:junit:4.13.2'
|
||||||
|
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
||||||
|
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
|
||||||
|
}
|
||||||
|
|
||||||
|
packagingOptions {
|
||||||
|
exclude 'META-INF/*'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,135 @@
|
|||||||
|
package net.micode.notes.tool;
|
||||||
|
|
||||||
|
import android.annotation.TargetApi;
|
||||||
|
import android.app.DialogFragment;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.hardware.fingerprint.FingerprintManager;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.CancellationSignal;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import net.micode.notes.R;
|
||||||
|
import net.micode.notes.ui.NotesListActivity;
|
||||||
|
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
|
||||||
|
@TargetApi(23)
|
||||||
|
public class FingerprintDialogFragment extends DialogFragment {
|
||||||
|
|
||||||
|
private FingerprintManager fingerprintManager;
|
||||||
|
|
||||||
|
private CancellationSignal mCancellationSignal;
|
||||||
|
|
||||||
|
private Cipher mCipher;
|
||||||
|
|
||||||
|
private NotesListActivity mActivity;
|
||||||
|
|
||||||
|
private TextView errorMsg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标识是否是用户主动取消的认证。
|
||||||
|
*/
|
||||||
|
private boolean isSelfCancelled;
|
||||||
|
|
||||||
|
public void setCipher(Cipher cipher) {
|
||||||
|
mCipher = cipher;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAttach(Context context) {
|
||||||
|
super.onAttach(context);
|
||||||
|
mActivity = (NotesListActivity) getActivity();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
fingerprintManager = getContext().getSystemService(FingerprintManager.class);
|
||||||
|
setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Material_Light_Dialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
|
||||||
|
View v = inflater.inflate(R.layout.fingerprint_dialog, container, false);
|
||||||
|
errorMsg = v.findViewById(R.id.error_msg);
|
||||||
|
TextView cancel = v.findViewById(R.id.cancel);
|
||||||
|
cancel.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
dismiss();
|
||||||
|
stopListening();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
// 开始指纹认证监听
|
||||||
|
startListening(mCipher);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
// 停止指纹认证监听
|
||||||
|
stopListening();
|
||||||
|
}
|
||||||
|
|
||||||
|
//监听认证成功与失败
|
||||||
|
private void startListening(Cipher cipher) {
|
||||||
|
isSelfCancelled = false;
|
||||||
|
mCancellationSignal = new CancellationSignal();
|
||||||
|
fingerprintManager.authenticate(new FingerprintManager.CryptoObject(cipher), mCancellationSignal, 0, new FingerprintManager.AuthenticationCallback() {
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationError(int errorCode, CharSequence errString) {
|
||||||
|
if (!isSelfCancelled) {
|
||||||
|
errorMsg.setText(errString);
|
||||||
|
if (errorCode == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT) {
|
||||||
|
Toast.makeText(mActivity, errString, Toast.LENGTH_SHORT).show();
|
||||||
|
dismiss();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mActivity.onStopAuthenticated();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
|
||||||
|
errorMsg.setText(helpString);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
|
||||||
|
Toast.makeText(mActivity, "指纹认证成功", Toast.LENGTH_SHORT).show();
|
||||||
|
mActivity.onAuthenticated();
|
||||||
|
dismiss();
|
||||||
|
// mActivity.onAuthenticated();//认证成功后就可以写成功后的代码逻辑
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationFailed() {
|
||||||
|
errorMsg.setText("指纹认证失败,请再试一次");
|
||||||
|
}
|
||||||
|
}, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void stopListening() {
|
||||||
|
if (mCancellationSignal != null) {
|
||||||
|
mCancellationSignal.cancel();
|
||||||
|
mCancellationSignal = null;
|
||||||
|
isSelfCancelled = true;
|
||||||
|
}
|
||||||
|
mActivity.onStopAuthenticated();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
package net.micode.notes.ui;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.speech.RecognizerIntent;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
public class VoiceNoteActivity extends Activity {
|
||||||
|
private static final int REQUEST_CODE_SPEECH_INPUT = 1000;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
startVoiceRecognition();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startVoiceRecognition() {
|
||||||
|
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
|
||||||
|
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
|
||||||
|
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
|
||||||
|
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speak now...");
|
||||||
|
try {
|
||||||
|
startActivityForResult(intent, REQUEST_CODE_SPEECH_INPUT);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Toast.makeText(this, "Speech recognition is not supported on this device.", Toast.LENGTH_SHORT).show();
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
|
super.onActivityResult(requestCode, resultCode, data);
|
||||||
|
if (requestCode == REQUEST_CODE_SPEECH_INPUT && resultCode == RESULT_OK && data != null) {
|
||||||
|
ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
|
||||||
|
if (result != null && !result.isEmpty()) {
|
||||||
|
Intent intent = new Intent();
|
||||||
|
intent.putExtra("recognizedText", result.get(0));
|
||||||
|
setResult(RESULT_OK, intent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 751 B |
After Width: | Height: | Size: 484 B |
After Width: | Height: | Size: 754 B |
After Width: | Height: | Size: 3.9 KiB |
@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:padding="16dp">
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/note_content"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="Enter your note here" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonVoiceNote"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/note_content"
|
||||||
|
android:layout_marginTop="44dp"
|
||||||
|
android:text="Voice Note" />
|
||||||
|
</RelativeLayout>
|
@ -0,0 +1,52 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:src="@drawable/ic_fp_40px"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
android:text="请验证指纹解锁"
|
||||||
|
android:textColor="#000"
|
||||||
|
android:textSize="16sp"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/error_msg"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:textSize="12sp"
|
||||||
|
android:textColor="#f45"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0.5dp"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:background="#ccc"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/cancel"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="50dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="取消"
|
||||||
|
android:textColor="#5d7883"
|
||||||
|
android:textSize="16sp"
|
||||||
|
/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<style name="AppTheme.Base" parent="Theme.AppCompat.Light">
|
||||||
|
<item name="colorPrimary">#C1F5FFF9</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="UI.AppTheme" parent="AppTheme.Base">
|
||||||
|
</style>
|
||||||
|
</resources>
|
@ -0,0 +1,17 @@
|
|||||||
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
google()
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
dependencies {
|
||||||
|
classpath 'com.android.tools.build:gradle:7.4.1'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
allprojects {
|
||||||
|
repositories {
|
||||||
|
google()
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
ECLIPSE ANDROID PROJECT IMPORT SUMMARY
|
||||||
|
======================================
|
||||||
|
|
||||||
|
Ignored Files:
|
||||||
|
--------------
|
||||||
|
The following files were *not* copied into the new Gradle project; you
|
||||||
|
should evaluate whether these are still needed in your project and if
|
||||||
|
so manually move them:
|
||||||
|
|
||||||
|
* .gitignore
|
||||||
|
* NOTICE
|
||||||
|
* README
|
||||||
|
|
||||||
|
Moved Files:
|
||||||
|
------------
|
||||||
|
Android Gradle projects use a different directory structure than ADT
|
||||||
|
Eclipse projects. Here's how the projects were restructured:
|
||||||
|
|
||||||
|
* AndroidManifest.xml => app\src\main\AndroidManifest.xml
|
||||||
|
* res\ => app\src\main\res\
|
||||||
|
* src\ => app\src\main\java\
|
||||||
|
|
||||||
|
Next Steps:
|
||||||
|
-----------
|
||||||
|
You can now build the project. The Gradle project needs network
|
||||||
|
connectivity to download dependencies.
|
||||||
|
|
||||||
|
Bugs:
|
||||||
|
-----
|
||||||
|
If for some reason your project does not build, and you determine that
|
||||||
|
it is due to a bug or limitation of the Eclipse to Gradle importer,
|
||||||
|
please file a bug at http://b.android.com with category
|
||||||
|
Component-Tools.
|
||||||
|
|
||||||
|
(This import summary is for your information only, and can be deleted
|
||||||
|
after import once you are satisfied with the results.)
|
@ -0,0 +1 @@
|
|||||||
|
include ':app'
|
Loading…
Reference in new issue