parent
d2886d77b9
commit
db85d9da5d
@ -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'
|
Binary file not shown.
Loading…
Reference in new issue