From 24220e7f838c48b2848d533a1545872209e9c17c Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Wed, 22 Mar 2023 09:33:13 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E7=BC=96=E8=AF=91=E5=B7=A5=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 2 +- .../java/com/navinfo/omqs/model/LoginUser.kt | 6 ++ .../java/com/navinfo/omqs/ui/BaseActivity.kt | 13 +++ .../java/com/navinfo/omqs/ui/LoginActivity.kt | 5 +- .../navinfo/omqs/ui/PermissionsActivity.kt | 2 +- app/src/main/res/layout/activity_login.xml | 97 +++++++++++++++++-- gradle.properties | 1 + 7 files changed, 116 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/model/LoginUser.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/BaseActivity.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7720dc64..0df27bc1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ android:theme="@style/Theme.OMQualityInspection" tools:targetApi="31"> diff --git a/app/src/main/java/com/navinfo/omqs/model/LoginUser.kt b/app/src/main/java/com/navinfo/omqs/model/LoginUser.kt new file mode 100644 index 00000000..77c0aceb --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/model/LoginUser.kt @@ -0,0 +1,6 @@ +package com.navinfo.omqs.model + +data class LoginUser( + var username: String = "", + var password: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/BaseActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/BaseActivity.kt new file mode 100644 index 00000000..55054de6 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/BaseActivity.kt @@ -0,0 +1,13 @@ +package com.navinfo.omqs.ui + +import android.content.pm.ActivityInfo +import android.os.Bundle +import android.os.PersistableBundle +import androidx.appcompat.app.AppCompatActivity + +open class BaseActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { + super.onCreate(savedInstanceState, persistentState) + requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE//横屏 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/LoginActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/LoginActivity.kt index 6b18b820..3d218d17 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/LoginActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/LoginActivity.kt @@ -3,6 +3,8 @@ package com.navinfo.omqs.ui import android.os.Bundle import android.os.PersistableBundle import androidx.activity.viewModels +import androidx.databinding.DataBindingUtil +import com.navinfo.omqs.R import com.navinfo.omqs.databinding.ActivityLoginBinding class LoginActivity : PermissionsActivity() { @@ -12,7 +14,8 @@ class LoginActivity : PermissionsActivity() { override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { super.onCreate(savedInstanceState, persistentState) - binding = ActivityLoginBinding.inflate(layoutInflater) + binding = DataBindingUtil.inflate(layoutInflater, R.layout.activity_login, null, false) + binding.lifecycleOwner = this setContentView(binding.root) } diff --git a/app/src/main/java/com/navinfo/omqs/ui/PermissionsActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/PermissionsActivity.kt index 77508544..64984e27 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/PermissionsActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/PermissionsActivity.kt @@ -11,7 +11,7 @@ import com.hjq.permissions.XXPermissions /** * 权限申请Activity */ -abstract class PermissionsActivity : AppCompatActivity() { +abstract class PermissionsActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { super.onCreate(savedInstanceState, persistentState) diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index a074df1d..7d771415 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -1,9 +1,92 @@ - + - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index d2ea1cc9..2d78f1af 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,6 +15,7 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 # Android operating system, and which are packaged with your app's APK # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true +android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official # Enables namespacing of each library's R class so that its R class includes only the From 1f82fc32b1c348ebe29366447824e862b9213235 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Wed, 22 Mar 2023 10:04:30 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E7=BC=96=E8=AF=91=E5=B7=A5=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- collect-library/build.gradle | 7 +- .../com/navinfo/collect/BaseActivity.java | 234 +++++++++--------- .../navinfo/collect/FlutterBaseActivity.kt | 86 +++---- gradle.properties | 3 +- settings.gradle | 2 - 5 files changed, 165 insertions(+), 167 deletions(-) diff --git a/collect-library/build.gradle b/collect-library/build.gradle index dfa30183..dd243089 100644 --- a/collect-library/build.gradle +++ b/collect-library/build.gradle @@ -106,11 +106,10 @@ dependencies { implementation "androidx.sqlite:sqlite:2.0.1" implementation "androidx.room:room-runtime:2.1.0" annotationProcessor "androidx.room:room-compiler:2.1.0" - kapt 'android.arch.persistence.room:compiler:1.1.1' // compiler 需要用 room 的 kapt "androidx.room:room-compiler:2.1.0" - androidTestImplementation "android.arch.persistence.room:testing:1.1.1" - implementation "android.arch.lifecycle:extensions:1.1.1" - kapt "android.arch.lifecycle:compiler:1.1.1" + androidTestImplementation 'androidx.room:room-testing:2.0.0' + implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' + kapt 'androidx.lifecycle:lifecycle-compiler:2.0.0' implementation 'com.tencent.wcdb:wcdb-android:1.0.0' implementation "androidx.core:core-ktx:1.8.0" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/collect-library/src/main/java/com/navinfo/collect/BaseActivity.java b/collect-library/src/main/java/com/navinfo/collect/BaseActivity.java index 03c8dd99..3a992a65 100644 --- a/collect-library/src/main/java/com/navinfo/collect/BaseActivity.java +++ b/collect-library/src/main/java/com/navinfo/collect/BaseActivity.java @@ -1,117 +1,117 @@ -package com.navinfo.collect; - -import android.Manifest; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.os.Build; -import android.os.Bundle; -import android.os.Environment; -import android.provider.Settings; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.app.ActivityCompat; -import androidx.core.content.PermissionChecker; - -import com.baidu.ai.edge.core.base.Consts; - - -/** - * Created by linyiran on 6/16/22. - */ -public abstract class BaseActivity extends AppCompatActivity { - private static final int REQUEST_PERMISSION = 1; - - protected boolean allPermissionsGranted; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setLayout(); - requestPermission(); - onActivityCreated(savedInstanceState); - } - - protected abstract void setLayout(); - - protected abstract void onActivityCreated(Bundle savedInstanceState); - - private void requestPermission() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - String[] permissions = new String[]{ - Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.INTERNET, - Manifest.permission.ACCESS_NETWORK_STATE, - Manifest.permission.READ_PHONE_STATE, - Manifest.permission.CAMERA - }; - allPermissionsGranted = true; - for (String perm : permissions) { - if ((PermissionChecker.checkSelfPermission(this, perm) != PermissionChecker.PERMISSION_GRANTED)) { - allPermissionsGranted = false; - break; - } - } - if (!allPermissionsGranted) { - ActivityCompat.requestPermissions(BaseActivity.this, permissions, REQUEST_PERMISSION); - } else { - requestAllFilesAccess(); - } - } else { - allPermissionsGranted = true; - } - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, - @NonNull int[] grantResults) { - if (requestCode == REQUEST_PERMISSION) { - allPermissionsGranted = true; - for (int grantRes : grantResults) { - if (grantRes != PackageManager.PERMISSION_GRANTED) { - allPermissionsGranted = false; - break; - } - } - if (allPermissionsGranted) { - requestAllFilesAccess(); - } - } - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - } - - /** - * Android 11 跳转到设置获取SD卡根目录写入权限 - */ - private void requestAllFilesAccess() { - if (!Consts.AUTH_REQUIRE_SDCARD) { - return; - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !Environment.isExternalStorageManager()) { - allPermissionsGranted = false; - - AlertDialog.Builder alertBuilder = new AlertDialog.Builder(BaseActivity.this, - androidx.appcompat.R.style.Theme_AppCompat_Light_Dialog_Alert); - alertBuilder.setMessage("需授权访问SD卡文件"); - alertBuilder.setCancelable(false); - alertBuilder.setPositiveButton("去设置", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(intent); - } - }); - alertBuilder.setNegativeButton("取消", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); - alertBuilder.show(); - } - } -} +//package com.navinfo.collect; +// +//import android.Manifest; +//import android.content.DialogInterface; +//import android.content.Intent; +//import android.content.pm.PackageManager; +//import android.os.Build; +//import android.os.Bundle; +//import android.os.Environment; +//import android.provider.Settings; +// +//import androidx.annotation.NonNull; +//import androidx.annotation.Nullable; +//import androidx.appcompat.app.AlertDialog; +//import androidx.appcompat.app.AppCompatActivity; +//import androidx.core.app.ActivityCompat; +//import androidx.core.content.PermissionChecker; +// +//import com.baidu.ai.edge.core.base.Consts; +// +// +///** +// * Created by linyiran on 6/16/22. +// */ +//public abstract class BaseActivity extends AppCompatActivity { +// private static final int REQUEST_PERMISSION = 1; +// +// protected boolean allPermissionsGranted; +// +// @Override +// protected void onCreate(@Nullable Bundle savedInstanceState) { +// super.onCreate(savedInstanceState); +// setLayout(); +// requestPermission(); +// onActivityCreated(savedInstanceState); +// } +// +// protected abstract void setLayout(); +// +// protected abstract void onActivityCreated(Bundle savedInstanceState); +// +// private void requestPermission() { +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { +// String[] permissions = new String[]{ +// Manifest.permission.WRITE_EXTERNAL_STORAGE, +// Manifest.permission.INTERNET, +// Manifest.permission.ACCESS_NETWORK_STATE, +// Manifest.permission.READ_PHONE_STATE, +// Manifest.permission.CAMERA +// }; +// allPermissionsGranted = true; +// for (String perm : permissions) { +// if ((PermissionChecker.checkSelfPermission(this, perm) != PermissionChecker.PERMISSION_GRANTED)) { +// allPermissionsGranted = false; +// break; +// } +// } +// if (!allPermissionsGranted) { +// ActivityCompat.requestPermissions(BaseActivity.this, permissions, REQUEST_PERMISSION); +// } else { +// requestAllFilesAccess(); +// } +// } else { +// allPermissionsGranted = true; +// } +// } +// +// @Override +// public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, +// @NonNull int[] grantResults) { +// if (requestCode == REQUEST_PERMISSION) { +// allPermissionsGranted = true; +// for (int grantRes : grantResults) { +// if (grantRes != PackageManager.PERMISSION_GRANTED) { +// allPermissionsGranted = false; +// break; +// } +// } +// if (allPermissionsGranted) { +// requestAllFilesAccess(); +// } +// } +// super.onRequestPermissionsResult(requestCode, permissions, grantResults); +// } +// +// /** +// * Android 11 跳转到设置获取SD卡根目录写入权限 +// */ +// private void requestAllFilesAccess() { +// if (!Consts.AUTH_REQUIRE_SDCARD) { +// return; +// } +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !Environment.isExternalStorageManager()) { +// allPermissionsGranted = false; +// +// AlertDialog.Builder alertBuilder = new AlertDialog.Builder(BaseActivity.this, +// androidx.appcompat.R.style.Theme_AppCompat_Light_Dialog_Alert); +// alertBuilder.setMessage("需授权访问SD卡文件"); +// alertBuilder.setCancelable(false); +// alertBuilder.setPositiveButton("去设置", new DialogInterface.OnClickListener() { +// @Override +// public void onClick(DialogInterface dialog, int which) { +// Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION); +// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// startActivity(intent); +// } +// }); +// alertBuilder.setNegativeButton("取消", new DialogInterface.OnClickListener() { +// @Override +// public void onClick(DialogInterface dialog, int which) { +// dialog.dismiss(); +// } +// }); +// alertBuilder.show(); +// } +// } +//} diff --git a/collect-library/src/main/java/com/navinfo/collect/FlutterBaseActivity.kt b/collect-library/src/main/java/com/navinfo/collect/FlutterBaseActivity.kt index 9f7e3ee0..865be3f1 100644 --- a/collect-library/src/main/java/com/navinfo/collect/FlutterBaseActivity.kt +++ b/collect-library/src/main/java/com/navinfo/collect/FlutterBaseActivity.kt @@ -1,43 +1,43 @@ -package com.navinfo.collect - -import android.content.Intent -import android.util.Log -import com.baidu.ai.edge.ui.view.model.BasePolygonResultModel -import com.navinfo.collect.library.map.flutter.plugin.FlutterMapViewFactory -import com.navinfo.collect.library.map.flutter.plugin.FlutterMapViewFlutterPlugin -import io.flutter.embedding.android.FlutterActivity -import io.flutter.embedding.engine.FlutterEngine -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -abstract class FlutterBaseActivity : FlutterActivity(), CoroutineScope by MainScope() { - lateinit var factory: FlutterMapViewFactory - override fun configureFlutterEngine(flutterEngine: FlutterEngine) { - super.configureFlutterEngine(flutterEngine) - factory = FlutterMapViewFlutterPlugin.registerWith(flutterEngine, this); -// FlutterNiMapCopyViewFlutterPlugin.registerWith(flutterEngine, this); - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == 0x10 && data != null) { - val path = data.getStringExtra("photo_path") - val list = data.getParcelableArrayListExtra("result_list") - Log.e("jingo","OCR java 返回的数据:"+ path + list.toString()); - if (path != null && list != null) { - factory.dataController.flutterDataCameraHandler.sendOcrResults( - path, - list as List - ) - } - } - } - - override fun onDestroy() { - super.onDestroy() - //协程销毁 - cancel() - } - -} \ No newline at end of file +//package com.navinfo.collect +// +//import android.content.Intent +//import android.util.Log +//import com.baidu.ai.edge.ui.view.model.BasePolygonResultModel +//import com.navinfo.collect.library.map.flutter.plugin.FlutterMapViewFactory +//import com.navinfo.collect.library.map.flutter.plugin.FlutterMapViewFlutterPlugin +//import io.flutter.embedding.android.FlutterActivity +//import io.flutter.embedding.engine.FlutterEngine +//import kotlinx.coroutines.CoroutineScope +//import kotlinx.coroutines.MainScope +//import kotlinx.coroutines.cancel +// +//abstract class FlutterBaseActivity : FlutterActivity(), CoroutineScope by MainScope() { +// lateinit var factory: FlutterMapViewFactory +// override fun configureFlutterEngine(flutterEngine: FlutterEngine) { +// super.configureFlutterEngine(flutterEngine) +// factory = FlutterMapViewFlutterPlugin.registerWith(flutterEngine, this); +//// FlutterNiMapCopyViewFlutterPlugin.registerWith(flutterEngine, this); +// } +// +// override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { +// super.onActivityResult(requestCode, resultCode, data) +// if (resultCode == 0x10 && data != null) { +// val path = data.getStringExtra("photo_path") +// val list = data.getParcelableArrayListExtra("result_list") +// Log.e("jingo","OCR java 返回的数据:"+ path + list.toString()); +// if (path != null && list != null) { +// factory.dataController.flutterDataCameraHandler.sendOcrResults( +// path, +// list as List +// ) +// } +// } +// } +// +// override fun onDestroy() { +// super.onDestroy() +// //协程销毁 +// cancel() +// } +// +//} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 2d78f1af..26bd972f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,4 +26,5 @@ systemProp.http.proxyHost=127.0.0.1 systemProp.http.proxyPort=1080 systemProp.https.proxyHost=127.0.0.1 systemProp.https.proxyPort=1080 -org.gradle.configureondemand=true \ No newline at end of file +org.gradle.configureondemand=true +android.experimental.legacyTransform.forceNonIncremental=true \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 184396c6..c122c82b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,7 +5,6 @@ pluginManagement { maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://maven.aliyun.com/repository/jcenter' } maven { url 'https://jitpack.io' } - maven { url 'https://download.flutter.io' } maven { url 'https://storage.googleapis.com/download.flutter.io' } google() mavenCentral() @@ -20,7 +19,6 @@ dependencyResolutionManagement { maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://maven.aliyun.com/repository/jcenter' } maven { url 'https://jitpack.io' } - maven { url 'https://download.flutter.io' } maven { url 'https://storage.googleapis.com/download.flutter.io' } google() mavenCentral() From 69dcc5e8eaccc450c107a2cd12ab3674aa9942d9 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Wed, 22 Mar 2023 10:27:37 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E7=BC=96=E8=AF=91=E5=B7=A5=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../library/data/handler/DataCameraHandler.kt | 442 +++++++++--------- 1 file changed, 221 insertions(+), 221 deletions(-) diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/handler/DataCameraHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/handler/DataCameraHandler.kt index 0ebcf2f7..9c3e323d 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/handler/DataCameraHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/handler/DataCameraHandler.kt @@ -1,223 +1,223 @@ -package com.navinfo.collect.library.data.handler - -import android.content.Context -import android.graphics.Bitmap -import android.graphics.BitmapFactory -import android.media.ExifInterface -import android.util.Log -import com.baidu.ai.edge.ui.util.ImageUtil -import com.baidu.ai.edge.ui.view.model.OcrViewResultModel -import com.navinfo.collect.FlutterBaseActivity -import com.navinfo.collect.library.data.dao.impl.MapLifeDataBase -import com.navinfo.ocr.OCRManager -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext -import java.io.* -import java.util.* - -interface OnOCRBatchListener { - fun onProgress(total: Int, current: Int) - suspend fun onResult(list: List>) -} - -open class DataCameraHandler( - context: Context, - activity: FlutterBaseActivity, - dataBase: MapLifeDataBase -) : - BaseDataHandler(context, dataBase) { - - private val mActivity: FlutterBaseActivity = activity - - init { - OCRManager.instance.init(activity) - } - - fun openCamera() { - OCRManager.instance.openCamera(mActivity) - } - - /** - * 批量OCR识别 - */ - fun ocrBatch(filePath: String, listener: OnOCRBatchListener) { - mActivity.launch(Dispatchers.IO) { - Log.e("jingo", "OCRManager 线程开始 ${Thread.currentThread().name}") - val file = File(filePath) - val resultList = mutableListOf>() - if (file.isDirectory) { - val fileList = file.listFiles() - val bitmapList = mutableListOf() - for (item in fileList!!) { - if (item.isFile) { - if (checkIsImageFile(item.name)) { - bitmapList.add(item.path) - } - } - } - val bfw: BufferedWriter - val csvFile = File("$filePath/ocr.csv") - val out: FileOutputStream - val osw: OutputStreamWriter - try { - out = FileOutputStream(csvFile) - //用excel打开,中文会乱码,所以用GBK编译 - osw = OutputStreamWriter(out, "GBK") - bfw = BufferedWriter(osw) - //第一行表头数据 - bfw.write("图片路径和名称,") - bfw.write("识别结果序号,") - bfw.write("识别结果内容,") - bfw.write("置信度,") - bfw.write("识别面积,") - bfw.write("图片大小,") - bfw.write("识别区域,") - //写好表头后换行 - bfw.newLine() - for (i in 0 until bitmapList.size) { - val path = bitmapList[i] - - val bitmap: Bitmap? = readFile(path) - var exif = ExifInterface(path) - val exifRotation = exif.getAttributeInt( - ExifInterface.TAG_ORIENTATION, - ExifInterface.ORIENTATION_NORMAL - ) - val rotation = ImageUtil.exifToDegrees(exifRotation) - val rotateBitmap = ImageUtil.createRotateBitmap(bitmap, rotation) - val list = OCRManager.instance.ocr(rotateBitmap) - - -// val list = ocrBitmap(path) - if (list != null) { - for (o in list) { - bfw.write("$path,") - bfw.write("${o.index},") - bfw.write("${o.name},") - bfw.write("${o.confidence.toString()},") - val pointList = o.bounds - bfw.write("${(pointList[3].y - pointList[0].y) * (pointList[2].x - pointList[0].x)},") - bfw.write("${rotateBitmap.width} ${rotateBitmap.height},") - bfw.write("${o.bounds[0].x} ${o.bounds[0].y};${o.bounds[1].x} ${o.bounds[1].y};${o.bounds[2].x} ${o.bounds[2].y};${o.bounds[3].x} ${o.bounds[3].y},") - bfw.newLine() - } - bfw.newLine() - withContext(Dispatchers.Main) { - listener.onProgress(bitmapList.size, i) - } - val m1 = mutableMapOf(); - m1["data"] = list; - m1["width"] = rotateBitmap.width - m1["height"] = rotateBitmap.height - m1["path"] = path - resultList.add(m1) - } - rotateBitmap.recycle() - } - - //将缓存数据写入文件 - bfw.flush() - //释放缓存 - bfw.close() - osw.close() - out.close() - } catch (e: Throwable) { - - } - //将缓存数据写入文件 - - withContext(Dispatchers.Main) { - Log.e("jingo", "OCRManager 线程名称2 ${Thread.currentThread().name}") - listener.onResult(resultList) - } - } else if (file.isFile && checkIsImageFile(file.name)) { - val list = ocrBitmap(filePath) - if (list != null) { - withContext(Dispatchers.Main) { - Log.e("jingo", "OCRManager 线程名称2 ${Thread.currentThread().name}") - listener.onProgress(1, 1) - } - val m = mutableMapOf>() - m[file.name] = list - resultList.add(m) - } - withContext(Dispatchers.Main) { - Log.e("jingo", "OCRManager 线程名称2 ${Thread.currentThread().name}") - listener.onResult(resultList) - } - } - - } - } - - private fun ocrBitmap(path: String): List? { - try { - val bitmap: Bitmap? = readFile(path) - var exif = ExifInterface(path) - val exifRotation = exif.getAttributeInt( - ExifInterface.TAG_ORIENTATION, - ExifInterface.ORIENTATION_NORMAL - ) - val rotation = ImageUtil.exifToDegrees(exifRotation) - val rotateBitmap = ImageUtil.createRotateBitmap(bitmap, rotation) - val res = OCRManager.instance.ocr(rotateBitmap) - rotateBitmap.recycle() - return res - } catch (e: IOException) { - Log.e("jingo", "图像识别,获取图像信息失败 ${e.printStackTrace()}") - } - return null - } - - /** - * 检查是不是bitmap文件 - */ - private fun checkIsImageFile(fName: String): Boolean { - val isImageFile: Boolean - // 获取扩展名 - val fileEnd = fName.substring( - fName.lastIndexOf(".") + 1, - fName.length - ).lowercase(Locale.getDefault()) - isImageFile = - fileEnd == "jpg" || fileEnd == "png" || fileEnd == "webp" || fileEnd == "jpeg" || fileEnd == "bmp" - return isImageFile - } - - /** - * 读取bitmap文件 - */ - private fun readFile(path: String): Bitmap? { - var stream: FileInputStream? = null - try { - stream = FileInputStream(path) - return BitmapFactory.decodeStream(stream) - } catch (e: FileNotFoundException) { - e.printStackTrace() - } finally { - if (stream != null) { - try { - stream.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - } - return null - } - -// private fun onOcrBitmap( -// bitmap, confidence, -// object: OcrListener { -// override fun onResult(models: List) { -// if (models == null) { -// listener.onResult(null) -// return +//package com.navinfo.collect.library.data.handler +// +//import android.content.Context +//import android.graphics.Bitmap +//import android.graphics.BitmapFactory +//import android.media.ExifInterface +//import android.util.Log +//import com.baidu.ai.edge.ui.util.ImageUtil +//import com.baidu.ai.edge.ui.view.model.OcrViewResultModel +//import com.navinfo.collect.FlutterBaseActivity +//import com.navinfo.collect.library.data.dao.impl.MapLifeDataBase +//import com.navinfo.ocr.OCRManager +//import kotlinx.coroutines.Dispatchers +//import kotlinx.coroutines.launch +//import kotlinx.coroutines.withContext +//import java.io.* +//import java.util.* +// +//interface OnOCRBatchListener { +// fun onProgress(total: Int, current: Int) +// suspend fun onResult(list: List>) +//} +// +//open class DataCameraHandler( +// context: Context, +// activity: FlutterBaseActivity, +// dataBase: MapLifeDataBase +//) : +// BaseDataHandler(context, dataBase) { +// +// private val mActivity: FlutterBaseActivity = activity +// +// init { +// OCRManager.instance.init(activity) +// } +// +// fun openCamera() { +// OCRManager.instance.openCamera(mActivity) +// } +// +// /** +// * 批量OCR识别 +// */ +// fun ocrBatch(filePath: String, listener: OnOCRBatchListener) { +// mActivity.launch(Dispatchers.IO) { +// Log.e("jingo", "OCRManager 线程开始 ${Thread.currentThread().name}") +// val file = File(filePath) +// val resultList = mutableListOf>() +// if (file.isDirectory) { +// val fileList = file.listFiles() +// val bitmapList = mutableListOf() +// for (item in fileList!!) { +// if (item.isFile) { +// if (checkIsImageFile(item.name)) { +// bitmapList.add(item.path) +// } +// } +// } +// val bfw: BufferedWriter +// val csvFile = File("$filePath/ocr.csv") +// val out: FileOutputStream +// val osw: OutputStreamWriter +// try { +// out = FileOutputStream(csvFile) +// //用excel打开,中文会乱码,所以用GBK编译 +// osw = OutputStreamWriter(out, "GBK") +// bfw = BufferedWriter(osw) +// //第一行表头数据 +// bfw.write("图片路径和名称,") +// bfw.write("识别结果序号,") +// bfw.write("识别结果内容,") +// bfw.write("置信度,") +// bfw.write("识别面积,") +// bfw.write("图片大小,") +// bfw.write("识别区域,") +// //写好表头后换行 +// bfw.newLine() +// for (i in 0 until bitmapList.size) { +// val path = bitmapList[i] +// +// val bitmap: Bitmap? = readFile(path) +// var exif = ExifInterface(path) +// val exifRotation = exif.getAttributeInt( +// ExifInterface.TAG_ORIENTATION, +// ExifInterface.ORIENTATION_NORMAL +// ) +// val rotation = ImageUtil.exifToDegrees(exifRotation) +// val rotateBitmap = ImageUtil.createRotateBitmap(bitmap, rotation) +// val list = OCRManager.instance.ocr(rotateBitmap) +// +// +//// val list = ocrBitmap(path) +// if (list != null) { +// for (o in list) { +// bfw.write("$path,") +// bfw.write("${o.index},") +// bfw.write("${o.name},") +// bfw.write("${o.confidence.toString()},") +// val pointList = o.bounds +// bfw.write("${(pointList[3].y - pointList[0].y) * (pointList[2].x - pointList[0].x)},") +// bfw.write("${rotateBitmap.width} ${rotateBitmap.height},") +// bfw.write("${o.bounds[0].x} ${o.bounds[0].y};${o.bounds[1].x} ${o.bounds[1].y};${o.bounds[2].x} ${o.bounds[2].y};${o.bounds[3].x} ${o.bounds[3].y},") +// bfw.newLine() +// } +// bfw.newLine() +// withContext(Dispatchers.Main) { +// listener.onProgress(bitmapList.size, i) +// } +// val m1 = mutableMapOf(); +// m1["data"] = list; +// m1["width"] = rotateBitmap.width +// m1["height"] = rotateBitmap.height +// m1["path"] = path +// resultList.add(m1) +// } +// rotateBitmap.recycle() +// } +// +// //将缓存数据写入文件 +// bfw.flush() +// //释放缓存 +// bfw.close() +// osw.close() +// out.close() +// } catch (e: Throwable) { +// +// } +// //将缓存数据写入文件 +// +// withContext(Dispatchers.Main) { +// Log.e("jingo", "OCRManager 线程名称2 ${Thread.currentThread().name}") +// listener.onResult(resultList) +// } +// } else if (file.isFile && checkIsImageFile(file.name)) { +// val list = ocrBitmap(filePath) +// if (list != null) { +// withContext(Dispatchers.Main) { +// Log.e("jingo", "OCRManager 线程名称2 ${Thread.currentThread().name}") +// listener.onProgress(1, 1) +// } +// val m = mutableMapOf>() +// m[file.name] = list +// resultList.add(m) +// } +// withContext(Dispatchers.Main) { +// Log.e("jingo", "OCRManager 线程名称2 ${Thread.currentThread().name}") +// listener.onResult(resultList) +// } // } -// ocrResultModelCache = models -// listener.onResult(models) +// // } -// }) - -} \ No newline at end of file +// } +// +// private fun ocrBitmap(path: String): List? { +// try { +// val bitmap: Bitmap? = readFile(path) +// var exif = ExifInterface(path) +// val exifRotation = exif.getAttributeInt( +// ExifInterface.TAG_ORIENTATION, +// ExifInterface.ORIENTATION_NORMAL +// ) +// val rotation = ImageUtil.exifToDegrees(exifRotation) +// val rotateBitmap = ImageUtil.createRotateBitmap(bitmap, rotation) +// val res = OCRManager.instance.ocr(rotateBitmap) +// rotateBitmap.recycle() +// return res +// } catch (e: IOException) { +// Log.e("jingo", "图像识别,获取图像信息失败 ${e.printStackTrace()}") +// } +// return null +// } +// +// /** +// * 检查是不是bitmap文件 +// */ +// private fun checkIsImageFile(fName: String): Boolean { +// val isImageFile: Boolean +// // 获取扩展名 +// val fileEnd = fName.substring( +// fName.lastIndexOf(".") + 1, +// fName.length +// ).lowercase(Locale.getDefault()) +// isImageFile = +// fileEnd == "jpg" || fileEnd == "png" || fileEnd == "webp" || fileEnd == "jpeg" || fileEnd == "bmp" +// return isImageFile +// } +// +// /** +// * 读取bitmap文件 +// */ +// private fun readFile(path: String): Bitmap? { +// var stream: FileInputStream? = null +// try { +// stream = FileInputStream(path) +// return BitmapFactory.decodeStream(stream) +// } catch (e: FileNotFoundException) { +// e.printStackTrace() +// } finally { +// if (stream != null) { +// try { +// stream.close() +// } catch (e: IOException) { +// e.printStackTrace() +// } +// } +// } +// return null +// } +// +//// private fun onOcrBitmap( +//// bitmap, confidence, +//// object: OcrListener { +//// override fun onResult(models: List) { +//// if (models == null) { +//// listener.onResult(null) +//// return +//// } +//// ocrResultModelCache = models +//// listener.onResult(models) +//// } +//// }) +// +//} \ No newline at end of file From 5e8b75005fba18a79dce1f9f6062456eb1f0d3f7 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Fri, 24 Mar 2023 13:56:13 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E8=B0=83=E6=95=B4mapapi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 35 +- .../java/com/navinfo/omqs/ui/BaseActivity.kt | 13 - .../java/com/navinfo/omqs/ui/LoginActivity.kt | 33 - .../navinfo/omqs/ui/LoginActivityViewModel.kt | 7 - .../java/com/navinfo/omqs/ui/MainActivity.kt | 62 -- .../navinfo/omqs/ui/activity/BaseActivity.kt | 16 + .../navinfo/omqs/ui/activity/LoginActivity.kt | 40 + .../omqs/ui/activity/LoginViewModel.kt | 23 + .../navinfo/omqs/ui/activity/MainActivity.kt | 32 + .../navinfo/omqs/ui/activity/MainViewModel.kt | 36 + .../ui/{ => activity}/PermissionsActivity.kt | 51 +- .../omqs/{ => ui/fragment}/FirstFragment.kt | 3 +- .../omqs/{ => ui/fragment}/SecondFragment.kt | 5 +- app/src/main/res/layout/activity_login.xml | 34 +- app/src/main/res/layout/activity_main.xml | 42 +- app/src/main/res/layout/fragment_first.xml | 2 +- app/src/main/res/layout/fragment_second.xml | 2 +- app/src/main/res/menu/menu_main.xml | 2 +- app/src/main/res/navigation/nav_graph.xml | 4 +- app/src/main/res/values/strings.xml | 5 + collect-library/build.gradle | 2 +- .../libs/BaiduLBS_AndroidSDK_Lib.aar | Bin 0 -> 2157648 bytes collect-library/src/main/AndroidManifest.xml | 17 +- .../collect/library/data/RealmUtils.java | 3 +- .../collect/library/map/NILayerManager.java | 662 ++++++++-------- .../navinfo/collect/library/map/NILocation.kt | 8 - .../navinfo/collect/library/map/NIMap.java | 706 ++++++++---------- .../collect/library/map/NIMapController.kt | 38 +- .../collect/library/map/NIMapView.java | 587 ++++++++------- .../library/map/handler/BaseHandler.kt | 17 +- .../map/handler/LayerManagerHandler.kt | 104 ++- .../library/map/handler/LineHandler.kt | 37 +- .../map/handler/LocationLayerHandler.kt | 128 +++- .../map/handler/MapBaseControlHandler.kt | 18 - .../library/map/handler/MarkHandler.kt | 100 +-- .../map/handler/MeasureLayerHandler.kt | 436 +++++------ .../library/map/handler/PolygonHandler.kt | 138 ++-- .../library/map/layers/NaviLocationLayer.java | 2 +- .../library/map/layers/NaviMapScaleBar.java | 2 +- .../source/NavinfoMapRastorTileSource.java | 3 + .../src/main/res/layout/base_map_layout.xml | 40 +- .../main/res/xml/network_security_config.xml | 5 + 43 files changed, 1873 insertions(+), 1631 deletions(-) delete mode 100644 app/src/main/java/com/navinfo/omqs/ui/BaseActivity.kt delete mode 100644 app/src/main/java/com/navinfo/omqs/ui/LoginActivity.kt delete mode 100644 app/src/main/java/com/navinfo/omqs/ui/LoginActivityViewModel.kt delete mode 100644 app/src/main/java/com/navinfo/omqs/ui/MainActivity.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/activity/BaseActivity.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/activity/LoginActivity.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/activity/LoginViewModel.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/activity/MainActivity.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/activity/MainViewModel.kt rename app/src/main/java/com/navinfo/omqs/ui/{ => activity}/PermissionsActivity.kt (57%) rename app/src/main/java/com/navinfo/omqs/{ => ui/fragment}/FirstFragment.kt (95%) rename app/src/main/java/com/navinfo/omqs/{ => ui/fragment}/SecondFragment.kt (93%) create mode 100644 collect-library/libs/BaiduLBS_AndroidSDK_Lib.aar delete mode 100644 collect-library/src/main/java/com/navinfo/collect/library/map/NILocation.kt delete mode 100644 collect-library/src/main/java/com/navinfo/collect/library/map/handler/MapBaseControlHandler.kt create mode 100644 collect-library/src/main/res/xml/network_security_config.xml diff --git a/app/build.gradle b/app/build.gradle index 353bb4e8..506d1fc7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -24,8 +24,8 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0df27bc1..052e141b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,18 +1,43 @@ - + xmlns:tools="http://schemas.android.com/tools" + package="com.navinfo.omqs"> + + + + + + + + + + + + + + + + + + + + + + + + @@ -22,6 +47,10 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/BaseActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/BaseActivity.kt deleted file mode 100644 index 55054de6..00000000 --- a/app/src/main/java/com/navinfo/omqs/ui/BaseActivity.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.navinfo.omqs.ui - -import android.content.pm.ActivityInfo -import android.os.Bundle -import android.os.PersistableBundle -import androidx.appcompat.app.AppCompatActivity - -open class BaseActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { - super.onCreate(savedInstanceState, persistentState) - requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE//横屏 - } -} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/LoginActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/LoginActivity.kt deleted file mode 100644 index 3d218d17..00000000 --- a/app/src/main/java/com/navinfo/omqs/ui/LoginActivity.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.navinfo.omqs.ui - -import android.os.Bundle -import android.os.PersistableBundle -import androidx.activity.viewModels -import androidx.databinding.DataBindingUtil -import com.navinfo.omqs.R -import com.navinfo.omqs.databinding.ActivityLoginBinding - -class LoginActivity : PermissionsActivity() { - - private lateinit var binding: ActivityLoginBinding - private val viewModel by viewModels() - - override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { - super.onCreate(savedInstanceState, persistentState) - binding = DataBindingUtil.inflate(layoutInflater, R.layout.activity_login, null, false) - binding.lifecycleOwner = this - setContentView(binding.root) - } - - override fun onPermissionsGranted() { - initView() - } - - private fun initView() { - - } - - override fun onPermissionsDenied() { - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/LoginActivityViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/LoginActivityViewModel.kt deleted file mode 100644 index 10656373..00000000 --- a/app/src/main/java/com/navinfo/omqs/ui/LoginActivityViewModel.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.navinfo.omqs.ui - -import androidx.lifecycle.ViewModel - -class LoginActivityViewModel : ViewModel() { - -} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/MainActivity.kt deleted file mode 100644 index f3f042eb..00000000 --- a/app/src/main/java/com/navinfo/omqs/ui/MainActivity.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.navinfo.omqs.ui - -import android.os.Bundle -import com.google.android.material.snackbar.Snackbar -import androidx.appcompat.app.AppCompatActivity -import androidx.core.view.WindowCompat -import androidx.navigation.findNavController -import androidx.navigation.ui.AppBarConfiguration -import androidx.navigation.ui.navigateUp -import androidx.navigation.ui.setupActionBarWithNavController -import android.view.Menu -import android.view.MenuItem -import com.navinfo.omqs.R -import com.navinfo.omqs.databinding.ActivityMainBinding - -class MainActivity : AppCompatActivity() { - - private lateinit var appBarConfiguration: AppBarConfiguration - private lateinit var binding: ActivityMainBinding - - override fun onCreate(savedInstanceState: Bundle?) { - WindowCompat.setDecorFitsSystemWindows(window, false) - super.onCreate(savedInstanceState) - - binding = ActivityMainBinding.inflate(layoutInflater) - setContentView(binding.root) - - setSupportActionBar(binding.toolbar) - - val navController = findNavController(R.id.nav_host_fragment_content_main) - appBarConfiguration = AppBarConfiguration(navController.graph) - setupActionBarWithNavController(navController, appBarConfiguration) - - binding.fab.setOnClickListener { view -> - Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) - .setAnchorView(R.id.fab) - .setAction("Action", null).show() - } - } - - override fun onCreateOptionsMenu(menu: Menu): Boolean { - // Inflate the menu; this adds items to the action bar if it is present. - menuInflater.inflate(R.menu.menu_main, menu) - return true - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - // Handle action bar item clicks here. The action bar will - // automatically handle clicks on the Home/Up button, so long - // as you specify a parent activity in AndroidManifest.xml. - return when (item.itemId) { - R.id.action_settings -> true - else -> super.onOptionsItemSelected(item) - } - } - - override fun onSupportNavigateUp(): Boolean { - val navController = findNavController(R.id.nav_host_fragment_content_main) - return navController.navigateUp(appBarConfiguration) - || super.onSupportNavigateUp() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/BaseActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/BaseActivity.kt new file mode 100644 index 00000000..481a05f4 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/BaseActivity.kt @@ -0,0 +1,16 @@ +package com.navinfo.omqs.ui.activity + +import android.content.pm.ActivityInfo +import android.os.Bundle +import android.os.PersistableBundle +import androidx.appcompat.app.AppCompatActivity + +/** + * 基类 + */ +open class BaseActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE//横屏 + super.onCreate(savedInstanceState) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/LoginActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/LoginActivity.kt new file mode 100644 index 00000000..4ba3dd65 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/LoginActivity.kt @@ -0,0 +1,40 @@ +package com.navinfo.omqs.ui.activity + +import android.content.Intent +import android.os.Bundle +import androidx.activity.viewModels +import androidx.databinding.DataBindingUtil +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.ActivityLoginBinding + +/** + * 登陆页面 + */ +class LoginActivity : PermissionsActivity() { + + private lateinit var binding: ActivityLoginBinding + private val viewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, R.layout.activity_login) + binding.loginUserModel = viewModel + binding.lifecycleOwner = this + binding.activity = this + } + + override fun onPermissionsGranted() { + } + + override fun onPermissionsDenied() { + } + + /** + * 处理登录按钮 + */ + fun onClickLoginButton() { + val intent = Intent(this@LoginActivity, MainActivity::class.java) + startActivity(intent) + finish() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/LoginViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/LoginViewModel.kt new file mode 100644 index 00000000..29efc8fc --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/LoginViewModel.kt @@ -0,0 +1,23 @@ +package com.navinfo.omqs.ui.activity + +import android.view.View +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.navinfo.omqs.model.LoginUser + +class LoginViewModel : ViewModel() { + val loginUser: MutableLiveData = MutableLiveData() + + init { + loginUser.value = LoginUser(username = "admin", password = "123456") + } + + /** + * 处理注册按钮 + */ + fun onClick(view: View) { + loginUser.value!!.username = "admin2" + loginUser.postValue(loginUser.value) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/MainActivity.kt new file mode 100644 index 00000000..346a04a1 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/MainActivity.kt @@ -0,0 +1,32 @@ +package com.navinfo.omqs.ui.activity + +import android.os.Bundle +import androidx.activity.viewModels +import androidx.core.view.WindowCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.LifecycleObserver +import androidx.lifecycle.LifecycleOwner +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.ActivityMainBinding + +/** + * 地图主页面 + */ +class MainActivity : BaseActivity() { + + private lateinit var binding: ActivityMainBinding + private val viewModel by viewModels() + override fun onCreate(savedInstanceState: Bundle?) { + WindowCompat.setDecorFitsSystemWindows(window, false) + super.onCreate(savedInstanceState) + + binding = DataBindingUtil.setContentView(this, R.layout.activity_main) + binding.lifecycleOwner = this + viewModel.initMap(this, binding.mainActivityMap) + lifecycle.addObserver(viewModel) +// val navController = findNavController(R.id.nav_host_fragment_content_main) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/MainViewModel.kt new file mode 100644 index 00000000..9be9fa04 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/MainViewModel.kt @@ -0,0 +1,36 @@ +package com.navinfo.omqs.ui.activity + +import android.content.Context +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.ViewModel +import com.navinfo.collect.library.map.NIMapController +import com.navinfo.collect.library.map.NIMapView + +class MainViewModel : ViewModel(), DefaultLifecycleObserver { + private lateinit var mapController: NIMapController + + fun initMap(context: Context, mapView: NIMapView) { + mapController = NIMapController(context = context, mapView = mapView) + + } + + override fun onStart(owner: LifecycleOwner) { + super.onStart(owner) + mapController.locationLayerHandler.startLocation() + } + + override fun onPause(owner: LifecycleOwner) { + mapController.mMapView.onPause() + } + + override fun onDestroy(owner: LifecycleOwner) { + mapController.mMapView.onDestroy() + mapController.locationLayerHandler.stopLocation() + } + + override fun onResume(owner: LifecycleOwner) { + mapController.mMapView.onResume() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/PermissionsActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/PermissionsActivity.kt similarity index 57% rename from app/src/main/java/com/navinfo/omqs/ui/PermissionsActivity.kt rename to app/src/main/java/com/navinfo/omqs/ui/activity/PermissionsActivity.kt index 64984e27..37cebe65 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/PermissionsActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/PermissionsActivity.kt @@ -1,9 +1,8 @@ -package com.navinfo.omqs.ui +package com.navinfo.omqs.ui.activity +import android.os.Build import android.os.Bundle -import android.os.PersistableBundle import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity import com.hjq.permissions.OnPermissionCallback import com.hjq.permissions.Permission import com.hjq.permissions.XXPermissions @@ -11,14 +10,30 @@ import com.hjq.permissions.XXPermissions /** * 权限申请Activity */ -abstract class PermissionsActivity : BaseActivity() { - override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { - super.onCreate(savedInstanceState, persistentState) - +open class PermissionsActivity : BaseActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val permissionList = mutableListOf() + if (applicationInfo.targetSdkVersion >= Build.VERSION_CODES.TIRAMISU) { + //文件读写 + permissionList.add(Permission.READ_MEDIA_IMAGES) + permissionList.add(Permission.READ_MEDIA_AUDIO) + permissionList.add(Permission.READ_MEDIA_VIDEO) + } else { + //文件读写 + permissionList.add(Permission.WRITE_EXTERNAL_STORAGE) + permissionList.add(Permission.READ_EXTERNAL_STORAGE) + permissionList.add(Permission.READ_MEDIA_VIDEO) + } + //定位权限 + permissionList.add(Permission.ACCESS_FINE_LOCATION) + permissionList.add(Permission.ACCESS_COARSE_LOCATION) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + permissionList.add(Permission.ACCESS_BACKGROUND_LOCATION) + } XXPermissions.with(this) // 申请单个权限 - .permission(Permission.WRITE_EXTERNAL_STORAGE) - .permission(Permission.READ_EXTERNAL_STORAGE) + .permission(permissionList) // 设置权限请求拦截器(局部设置) //.interceptor(new PermissionInterceptor()) // 设置不触发错误检测机制(局部设置) @@ -35,6 +50,8 @@ abstract class PermissionsActivity : BaseActivity() { .show() onPermissionsGranted() return + } else { + onPermissionsDenied() } // 在SD卡创建项目目录 } @@ -51,11 +68,23 @@ abstract class PermissionsActivity : BaseActivity() { XXPermissions.startPermissionActivity(this@PermissionsActivity, permissions) onPermissionsDenied() } else { + onPermissionsDenied() } } }) } - abstract fun onPermissionsGranted() - abstract fun onPermissionsDenied() + /** + * 权限全部同意 + */ + open fun onPermissionsGranted() { + + } + + /** + * 权限 + */ + open fun onPermissionsDenied() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/FirstFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/FirstFragment.kt similarity index 95% rename from app/src/main/java/com/navinfo/omqs/FirstFragment.kt rename to app/src/main/java/com/navinfo/omqs/ui/fragment/FirstFragment.kt index 038ba3e0..ab8943a7 100644 --- a/app/src/main/java/com/navinfo/omqs/FirstFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/FirstFragment.kt @@ -1,4 +1,4 @@ -package com.navinfo.omqs +package com.navinfo.omqs.ui.fragment import android.os.Bundle import androidx.fragment.app.Fragment @@ -6,6 +6,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.navigation.fragment.findNavController +import com.navinfo.omqs.R import com.navinfo.omqs.databinding.FragmentFirstBinding /** diff --git a/app/src/main/java/com/navinfo/omqs/SecondFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/SecondFragment.kt similarity index 93% rename from app/src/main/java/com/navinfo/omqs/SecondFragment.kt rename to app/src/main/java/com/navinfo/omqs/ui/fragment/SecondFragment.kt index 7e3e1b25..b9a3bffb 100644 --- a/app/src/main/java/com/navinfo/omqs/SecondFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/SecondFragment.kt @@ -1,4 +1,4 @@ -package com.navinfo.omqs +package com.navinfo.omqs.ui.fragment import android.os.Bundle import androidx.fragment.app.Fragment @@ -6,6 +6,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.navigation.fragment.findNavController +import com.navinfo.omqs.R import com.navinfo.omqs.databinding.FragmentSecondBinding /** @@ -22,7 +23,7 @@ class SecondFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { + ): View { _binding = FragmentSecondBinding.inflate(inflater, container, false) return binding.root diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 7d771415..cc8c603f 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -4,27 +4,33 @@ xmlns:tools="http://schemas.android.com/tools"> + + name="activity" + type="com.navinfo.omqs.ui.activity.LoginActivity" /> + + + tools:context=".ui.activity.LoginActivity"> + android:hint="@string/input_user_name" + android:text="@{loginUserModel.loginUser.username}" /> + android:text="@{loginUserModel.loginUser.password}" /> + app:layout_constraintVertical_bias="0.8" /> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 928ac25a..38ecd444 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,34 +1,22 @@ - + xmlns:tools="http://schemas.android.com/tools"> - + + + + + android:layout_height="match_parent" + android:fitsSystemWindows="true" + tools:context=".ui.activity.MainActivity"> - + android:layout_height="match_parent" /> - - - - - - - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_first.xml b/app/src/main/res/layout/fragment_first.xml index ddd95756..d7283fad 100644 --- a/app/src/main/res/layout/fragment_first.xml +++ b/app/src/main/res/layout/fragment_first.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".FirstFragment"> + tools:context=".ui.fragment.FirstFragment"> + tools:context=".ui.fragment.SecondFragment"> + tools:context="com.navinfo.omqs.ui.activity.MainActivity"> @@ -17,7 +17,7 @@ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4f4827da..93087049 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -43,4 +43,9 @@ libero vel nunc consequat, quis tincidunt nisl eleifend. Cras bibendum enim a justo luctus vestibulum. Fusce dictum libero quis erat maximus, vitae volutpat diam dignissim. + 请输入用户名 + 请输入密码 + 登录 + 注册 + imageDescription \ No newline at end of file diff --git a/collect-library/build.gradle b/collect-library/build.gradle index 7a682f14..9cc1452d 100644 --- a/collect-library/build.gradle +++ b/collect-library/build.gradle @@ -56,7 +56,7 @@ android { dependencies { api fileTree(dir: 'libs', include: ['*.jar', '*.aar']) - + api files('libs/BaiduLBS_AndroidSDK_Lib.aar') implementation "androidx.appcompat:appcompat:$appcompatVersion" implementation "com.google.android.material:material:$materialVersion" testImplementation 'junit:junit:4.13.2' diff --git a/collect-library/libs/BaiduLBS_AndroidSDK_Lib.aar b/collect-library/libs/BaiduLBS_AndroidSDK_Lib.aar new file mode 100644 index 0000000000000000000000000000000000000000..18d4fe80efa743569deab33a265fc98c3dc27350 GIT binary patch literal 2157648 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 z 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