Page 7 Stage 4
This commit is contained in:
parent
71c168488b
commit
ec813eda1b
6 changed files with 193 additions and 37 deletions
|
@ -12,8 +12,8 @@ android {
|
|||
applicationId = "uk.kagurach.android101"
|
||||
minSdk = 28
|
||||
targetSdk = 34
|
||||
versionCode = 173
|
||||
versionName = "1.7.3"
|
||||
versionCode = 174
|
||||
versionName = "1.7.4"
|
||||
|
||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
@ -47,6 +47,9 @@ android {
|
|||
buildFeatures {
|
||||
viewBinding = true
|
||||
}
|
||||
aaptOptions {
|
||||
noCompress("tflite")
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
@ -95,4 +98,8 @@ dependencies {
|
|||
implementation(libs.okhttp3)
|
||||
|
||||
implementation(libs.ffmpeg.min)
|
||||
|
||||
implementation (libs.tensorflow.lite.task.vision)
|
||||
// Import the GPU delegate plugin Library for GPU inference
|
||||
implementation (libs.tensorflow.lite.gpu.delegate.plugin)
|
||||
}
|
|
@ -47,9 +47,10 @@ public class MainActivity extends KaBaseActivity {
|
|||
super.onResume();
|
||||
|
||||
TextView tv = findViewById(R.id.tv_hello);
|
||||
textViewAppendString(tv, "Starting Initialize");
|
||||
textViewAppendString(tv, "Starting Initialize\nChecking Permission...");
|
||||
|
||||
if (Build.VERSION.SDK_INT >= 33) {
|
||||
textViewAppendString(tv, "Find api > 33, checking permission");
|
||||
textViewAppendString(tv, "Find api > 33");
|
||||
if (ContextCompat
|
||||
.checkSelfPermission
|
||||
(MainActivity.this, Manifest.permission.POST_NOTIFICATIONS)
|
||||
|
@ -70,20 +71,22 @@ public class MainActivity extends KaBaseActivity {
|
|||
new String[]{Manifest.permission.READ_MEDIA_AUDIO},
|
||||
102);
|
||||
}
|
||||
if (ContextCompat
|
||||
.checkSelfPermission
|
||||
(MainActivity.this, Manifest.permission.CAMERA)
|
||||
!= PackageManager.PERMISSION_GRANTED) {
|
||||
textViewAppendString(tv, "Acquiring CAMERA");
|
||||
ActivityCompat.requestPermissions
|
||||
(MainActivity.this,
|
||||
new String[]{Manifest.permission.CAMERA},
|
||||
102);
|
||||
}
|
||||
textViewAppendString(tv, "Check Finished");
|
||||
textViewAppendString(tv, "提示:常按有惊喜");
|
||||
}
|
||||
textViewAppendString(tv, "*************************\nfinished");
|
||||
|
||||
if (ContextCompat
|
||||
.checkSelfPermission
|
||||
(MainActivity.this, Manifest.permission.CAMERA)
|
||||
!= PackageManager.PERMISSION_GRANTED) {
|
||||
textViewAppendString(tv, "Acquiring CAMERA");
|
||||
ActivityCompat.requestPermissions
|
||||
(MainActivity.this,
|
||||
new String[]{Manifest.permission.CAMERA},
|
||||
103);
|
||||
}
|
||||
textViewAppendString(tv, "Check Finished");
|
||||
textViewAppendString(tv, "提示:常按有惊喜");
|
||||
|
||||
textViewAppendString(tv, "*************************\nFinished");
|
||||
|
||||
// Initialize Page Helper
|
||||
pageHelper = new PageHelper(this, null, MainActivity2.class, this);
|
||||
|
|
|
@ -3,23 +3,26 @@ package uk.kagurach.android101
|
|||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.graphics.BitmapFactory
|
||||
import android.media.AudioAttributes
|
||||
import android.media.MediaPlayer
|
||||
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.view.View.GONE
|
||||
import android.view.View.OnClickListener
|
||||
import android.view.View.OnLongClickListener
|
||||
import android.view.View.VISIBLE
|
||||
import android.widget.Button
|
||||
import android.widget.EditText
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.ImageButton
|
||||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import androidx.activity.enableEdgeToEdge
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import androidx.datastore.preferences.core.edit
|
||||
|
@ -40,11 +43,19 @@ import okhttp3.Request
|
|||
import okhttp3.RequestBody.Companion.asRequestBody
|
||||
import okhttp3.RequestBody.Companion.toRequestBody
|
||||
import okhttp3.Response
|
||||
import org.tensorflow.lite.support.image.TensorImage
|
||||
import org.tensorflow.lite.task.core.BaseOptions
|
||||
import org.tensorflow.lite.task.vision.classifier.Classifications
|
||||
import org.tensorflow.lite.task.vision.classifier.ImageClassifier
|
||||
import org.tensorflow.lite.task.vision.classifier.ImageClassifier.ImageClassifierOptions
|
||||
import uk.kagurach.android101.additionalActivity.CameraXActivity
|
||||
import uk.kagurach.android101.helper.ToastHelper
|
||||
import java.io.File
|
||||
import java.io.FileInputStream
|
||||
import java.io.IOException
|
||||
import java.io.InputStream
|
||||
import java.nio.ByteBuffer
|
||||
import java.nio.channels.FileChannel
|
||||
|
||||
|
||||
val Context.tgDatastore by preferencesDataStore(name = "tg_settings")
|
||||
|
@ -53,6 +64,7 @@ val DefaultID = stringPreferencesKey("default_id")
|
|||
|
||||
class Page7 : KaBaseActivity() {
|
||||
lateinit var storage: TGStorage
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
enableEdgeToEdge()
|
||||
|
@ -64,23 +76,34 @@ class Page7 : KaBaseActivity() {
|
|||
}
|
||||
storage = TGStorage(this)
|
||||
|
||||
findViewById<Button>(R.id.P7SendMessageButton).setOnClickListener(ButtonHandler(this))
|
||||
findViewById<Button>(R.id.P7SaveAndSetAPI).setOnClickListener(ButtonHandler(this))
|
||||
|
||||
findViewById<EditText>(R.id.Page7BotID).setText(runBlocking { storage.getDefaultAPI() })
|
||||
findViewById<EditText>(R.id.Page7ChatID).setText(runBlocking { storage.getDefaultID() })
|
||||
|
||||
findViewById<Button>(R.id.P7ShowResult).setOnClickListener(FrameButtonHandler())
|
||||
findViewById<Button>(R.id.P7SetAPI).setOnClickListener(FrameButtonHandler())
|
||||
findViewById<ImageButton>(R.id.P7CloseResultButton).setOnClickListener(FrameButtonHandler())
|
||||
findViewById<ImageButton>(R.id.P7CloseAPIButton).setOnClickListener(FrameButtonHandler())
|
||||
// Message
|
||||
findViewById<Button>(R.id.P7SendMessageButton).setOnClickListener(ButtonHandler(this))
|
||||
|
||||
// Record Audio
|
||||
findViewById<Button>(R.id.P7ListenAudio).setOnClickListener(RecordButtonHandler())
|
||||
findViewById<Button>(R.id.P7RecordAudio).setOnClickListener(RecordButtonHandler())
|
||||
findViewById<Button>(R.id.P7SendAudio).setOnClickListener(ButtonHandler(this))
|
||||
|
||||
// Photo
|
||||
findViewById<Button>(R.id.P7ShotPhoto).setOnClickListener(PhotoButtonHandler(this))
|
||||
findViewById<Button>(R.id.P7SendPhoto).setOnClickListener(ButtonHandler(this))
|
||||
findViewById<Button>(R.id.P7ViewPhoto).setOnClickListener(FrameButtonHandler())
|
||||
|
||||
// Base Settings
|
||||
findViewById<Button>(R.id.P7ShowResult).setOnClickListener(FrameButtonHandler())
|
||||
findViewById<Button>(R.id.P7SetAPI).setOnClickListener(FrameButtonHandler())
|
||||
|
||||
// In frame
|
||||
findViewById<Button>(R.id.P7SaveAndSetAPI).setOnClickListener(ButtonHandler(this))
|
||||
findViewById<Button>(R.id.P7RecognizePic).setOnClickListener(RecognizePhoto(this))
|
||||
|
||||
// Close Frame
|
||||
findViewById<ImageButton>(R.id.P7CloseResultButton).setOnClickListener(FrameButtonHandler())
|
||||
findViewById<ImageButton>(R.id.P7CloseAPIButton).setOnClickListener(FrameButtonHandler())
|
||||
findViewById<ImageButton>(R.id.P7CloseShowPicButton).setOnClickListener(FrameButtonHandler())
|
||||
}
|
||||
|
||||
inner class ButtonHandler(val activity: Activity) : OnClickListener {
|
||||
|
@ -105,6 +128,9 @@ class Page7 : KaBaseActivity() {
|
|||
storage.setDefaultAPI(botAPI)
|
||||
storage.setDefaultID(chatID)
|
||||
}
|
||||
runOnUiThread{
|
||||
ToastHelper.ShowToast("OKAY",baseContext)
|
||||
}
|
||||
}
|
||||
runOnUiThread {
|
||||
resultTextField.text = result
|
||||
|
@ -120,6 +146,11 @@ class Page7 : KaBaseActivity() {
|
|||
return
|
||||
}
|
||||
tgHandler.postText(text) { result ->
|
||||
if (result.contains("\"ok\":true")) {
|
||||
runOnUiThread{
|
||||
ToastHelper.ShowToast("OKAY",baseContext)
|
||||
}
|
||||
}
|
||||
runOnUiThread {
|
||||
resultTextField.text = result
|
||||
}
|
||||
|
@ -131,6 +162,11 @@ class Page7 : KaBaseActivity() {
|
|||
audioUri,
|
||||
baseContext,
|
||||
) { result ->
|
||||
if (result.contains("\"ok\":true")) {
|
||||
runOnUiThread{
|
||||
ToastHelper.ShowToast("OKAY",baseContext)
|
||||
}
|
||||
}
|
||||
runOnUiThread {
|
||||
resultTextField.text = result
|
||||
}
|
||||
|
@ -139,6 +175,11 @@ class Page7 : KaBaseActivity() {
|
|||
|
||||
R.id.P7SendPhoto -> { // 发送照片
|
||||
tgHandler.postImage(photoPath) { result ->
|
||||
if (result.contains("\"ok\":true")) {
|
||||
runOnUiThread{
|
||||
ToastHelper.ShowToast("OKAY",baseContext)
|
||||
}
|
||||
}
|
||||
runOnUiThread {
|
||||
resultTextField.text = result
|
||||
}
|
||||
|
@ -157,6 +198,7 @@ class Page7 : KaBaseActivity() {
|
|||
when (v.id) {
|
||||
R.id.P7ShowResult, R.id.P7CloseResultButton -> R.id.P7ResultFrame
|
||||
R.id.P7SetAPI, R.id.P7CloseAPIButton -> R.id.P7SetAPIFrame
|
||||
R.id.P7ViewPhoto, R.id.P7CloseShowPicButton -> R.id.P7ShowPicFrame
|
||||
else -> throw RuntimeException("Invalid Button")
|
||||
}
|
||||
)
|
||||
|
@ -197,18 +239,43 @@ class Page7 : KaBaseActivity() {
|
|||
}
|
||||
}
|
||||
|
||||
inner class PhotoButtonHandler(val context: Context) : OnClickListener, OnLongClickListener {
|
||||
inner class PhotoButtonHandler(val context: Context) : OnClickListener {
|
||||
override fun onClick(v: View) {
|
||||
val myIntent = Intent(context, CameraXActivity::class.java)
|
||||
startActivityForResult(myIntent, 1)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onLongClick(v: View): Boolean {
|
||||
TODO("Not yet implemented")
|
||||
inner class RecognizePhoto(val context: Context) : OnClickListener{
|
||||
override fun onClick(v: View) {
|
||||
// Initialization
|
||||
val options =
|
||||
ImageClassifierOptions.builder()
|
||||
.setBaseOptions(BaseOptions.builder().build())
|
||||
.setMaxResults(1)
|
||||
.build()
|
||||
|
||||
// Copy model
|
||||
val modelStream = assets.open("TFModels/mobilenet_v1.tflite")
|
||||
val bytes = modelStream.readBytes()
|
||||
val file = File(context.cacheDir.path + "/mobilenet_v1.tflite")
|
||||
file.writeBytes(bytes)
|
||||
|
||||
// Run
|
||||
val imageClassifier =
|
||||
ImageClassifier.createFromFileAndOptions(file,options)
|
||||
val results: List<Classifications> = imageClassifier.classify(
|
||||
TensorImage.fromBitmap(BitmapFactory.decodeFile(photoPath))
|
||||
)
|
||||
|
||||
val resultName = results.first().toString().split("\"")[1].split("\"").first()
|
||||
val resultScore = results.first().toString().split("score=").last().split("index").first()
|
||||
findViewById<TextView>(R.id.P7ViewPhotoRecognizeResult).text = "${resultName}:${resultScore}"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||
super.onActivityResult(requestCode, resultCode, data)
|
||||
when (requestCode) {
|
||||
|
@ -225,6 +292,8 @@ class Page7 : KaBaseActivity() {
|
|||
photoPath = data.getStringExtra("result") ?: return
|
||||
ToastHelper.ShowToast("Saved at ${photoPath}", this)
|
||||
findViewById<Button>(R.id.P7ViewPhoto).isEnabled = true
|
||||
findViewById<ImageView>(R.id.P7ViewPhotoPic)
|
||||
.setImageBitmap(BitmapFactory.decodeFile(photoPath))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -288,5 +288,78 @@
|
|||
</LinearLayout>
|
||||
</FrameLayout>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/P7ShowPicFrame"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginHorizontal="10dp"
|
||||
android:layout_marginVertical="25dp"
|
||||
android:background="@drawable/p7_result_layout"
|
||||
android:visibility="invisible">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="55dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginRight="15dp"
|
||||
android:layout_weight="1"
|
||||
android:text="@string/result"
|
||||
android:textSize="40sp" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/P7CloseShowPicButton"
|
||||
android:layout_width="45dp"
|
||||
android:layout_height="45dp"
|
||||
android:layout_marginTop="5dp"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:background="@drawable/close_24"
|
||||
android:clickable="true"
|
||||
android:contentDescription="@string/close" />
|
||||
</LinearLayout>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/P7ViewPhotoPic"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="10"
|
||||
android:layout_marginHorizontal="5dp"
|
||||
android:layout_marginTop="5dp"
|
||||
android:adjustViewBounds="true"
|
||||
android:scaleType="fitCenter"
|
||||
android:rotation="90" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/P7ViewPhotoRecognizeResult"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginTop="5dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:textSize="15sp"
|
||||
android:textAlignment="center"
|
||||
/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/P7RecognizePic"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
android:textAllCaps="false"
|
||||
android:text="Recognize"
|
||||
/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -20,4 +20,5 @@ kotlin.code.style=official
|
|||
# Enables namespacing of each library's R class so that its R class includes only the
|
||||
# resources declared in the library itself and none from the library's dependencies,
|
||||
# thereby reducing the size of the R class for that library
|
||||
android.nonTransitiveRClass=true
|
||||
android.nonTransitiveRClass=true
|
||||
org.gradle.configuration-cache=true
|
|
@ -27,6 +27,7 @@ moshiJson = "1.15.1"
|
|||
ffmpegKit = "6.0-2"
|
||||
cameraX = "1.3.4"
|
||||
cameraView = "1.3.4"
|
||||
tensorFlow = "0.4.4"
|
||||
|
||||
[libraries]
|
||||
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
|
||||
|
@ -56,16 +57,18 @@ androidx-annotation = { group = "androidx.annotation", name = "annotation", vers
|
|||
androidx-lifecycle-livedata-ktx = { group = "androidx.lifecycle", name = "lifecycle-livedata-ktx", version.ref = "lifecycleLivedataKtx" }
|
||||
androidx-lifecycle-viewmodel-ktx = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "lifecycleViewmodelKtx" }
|
||||
androidx-datastore-rxjava3 = { group = "androidx.datastore", name = "datastore-rxjava3", version.ref = "datastoreRxjava3" }
|
||||
androidx-work = { group = "androidx.work", name="work-runtime", version.ref = "androidxWork" }
|
||||
androidx-camera-core = { group = "androidx.camera",name = "camera-core",version.ref="cameraX"}
|
||||
androidx-camera-camera2 = { group = "androidx.camera",name = "camera-camera2",version.ref="cameraX"}
|
||||
androidx-camera-lifecycle = { group = "androidx.camera",name = "camera-lifecycle",version.ref="cameraX"}
|
||||
androidx-camera-view = { group = "androidx.camera",name="camera-view",version.ref="cameraView"}
|
||||
androidx-work = { group = "androidx.work", name = "work-runtime", version.ref = "androidxWork" }
|
||||
androidx-camera-core = { group = "androidx.camera", name = "camera-core", version.ref = "cameraX" }
|
||||
androidx-camera-camera2 = { group = "androidx.camera", name = "camera-camera2", version.ref = "cameraX" }
|
||||
androidx-camera-lifecycle = { group = "androidx.camera", name = "camera-lifecycle", version.ref = "cameraX" }
|
||||
androidx-camera-view = { group = "androidx.camera", name = "camera-view", version.ref = "cameraView" }
|
||||
|
||||
okhttp3 = { group = "com.squareup.okhttp3", name="okhttp",version.ref="okHttp3"}
|
||||
moshi = {group="com.squareup.moshi",name="moshi-kotlin",version.ref="moshiJson"}
|
||||
okhttp3 = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okHttp3" }
|
||||
moshi = { group = "com.squareup.moshi", name = "moshi-kotlin", version.ref = "moshiJson" }
|
||||
|
||||
ffmpeg-min = {group="com.arthenica",name="ffmpeg-kit-full",version.ref="ffmpegKit"}
|
||||
ffmpeg-min = { group = "com.arthenica", name = "ffmpeg-kit-full", version.ref = "ffmpegKit" }
|
||||
tensorflow-lite-gpu-delegate-plugin = { group = "org.tensorflow", name = "tensorflow-lite-gpu-delegate-plugin", version.ref = "tensorFlow" }
|
||||
tensorflow-lite-task-vision = { group = "org.tensorflow", name = "tensorflow-lite-task-vision", version.ref = "tensorFlow" }
|
||||
|
||||
[plugins]
|
||||
androidApplication = { id = "com.android.application", version.ref = "agp" }
|
||||
|
|
Loading…
Reference in a new issue