diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index afe97ef6..9624886b 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -1,8 +1,5 @@ - - diff --git a/app/build.gradle b/app/build.gradle index 77f94b0f..78bc1aac 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -53,6 +53,8 @@ dependencies { implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.50' implementation 'com.github.LuckSiege.PictureSelector:picture_library:2.2.5' + implementation 'com.camerakit:camerakit:1.0.0-beta3.11' + implementation 'com.camerakit:jpegkit:0.1.0' // implementation project(path: ':nsfw') // implementation project(path: ':OpenNSFW') implementation 'com.github.devzwy:open_nsfw_android:1.3.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b757e8bd..2dc38f43 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,7 @@ + @@ -24,6 +25,8 @@ + \ No newline at end of file diff --git a/app/src/main/change-playstore.png b/app/src/main/change-playstore.png new file mode 100644 index 00000000..78877ef6 Binary files /dev/null and b/app/src/main/change-playstore.png differ diff --git a/app/src/main/java/com/example/open_nsfw_android/util/PackageUtils.kt b/app/src/main/java/com/example/open_nsfw_android/util/PackageUtils.kt new file mode 100644 index 00000000..48cd508c --- /dev/null +++ b/app/src/main/java/com/example/open_nsfw_android/util/PackageUtils.kt @@ -0,0 +1,77 @@ +package com.example.open_nsfw_android.util + +import android.content.Context +import android.content.pm.PackageManager + +object PackageUtils { + /** + * 获取版本名称 + * + * @param context 上下文 + * + * @return 版本名称 + */ + fun getVersionName(context: Context): String? { + + //获取包管理器 + val pm = context.packageManager + //获取包信息 + try { + val packageInfo = + pm.getPackageInfo(context.packageName, 0) + //返回版本号 + return packageInfo.versionName + } catch (e: PackageManager.NameNotFoundException) { + e.printStackTrace() + } + return null + } + + /** + * 获取版本号 + * + * @param context 上下文 + * + * @return 版本号 + */ + fun getVersionCode(context: Context): Int { + + //获取包管理器 + val pm = context.packageManager + //获取包信息 + try { + val packageInfo = + pm.getPackageInfo(context.packageName, 0) + //返回版本号 + return packageInfo.versionCode + } catch (e: PackageManager.NameNotFoundException) { + e.printStackTrace() + } + return 0 + } + + /** + * 获取App的名称 + * + * @param context 上下文 + * + * @return 名称 + */ + fun getAppName(context: Context): String? { + val pm = context.packageManager + //获取包信息 + try { + val packageInfo = + pm.getPackageInfo(context.packageName, 0) + //获取应用 信息 + val applicationInfo = packageInfo.applicationInfo + //获取albelRes + val labelRes = applicationInfo.labelRes + //返回App的名称 + return context.resources.getString(labelRes) + } catch (e: PackageManager.NameNotFoundException) { + e.printStackTrace() + } + return null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/open_nsfw_android/view/CameraActivity.kt b/app/src/main/java/com/example/open_nsfw_android/view/CameraActivity.kt new file mode 100644 index 00000000..ec5dc53c --- /dev/null +++ b/app/src/main/java/com/example/open_nsfw_android/view/CameraActivity.kt @@ -0,0 +1,188 @@ +package com.example.open_nsfw_android.view + +import android.annotation.SuppressLint +import android.graphics.BitmapFactory +import android.graphics.ImageFormat +import android.graphics.Rect +import android.graphics.YuvImage +import android.hardware.Camera +import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import android.view.SurfaceHolder +import android.view.Window +import android.view.WindowManager +import android.widget.Toast +import com.example.open_nsfw_android.R +import getNsfwScore +import kotlinx.android.synthetic.main.cameraaty.* +import java.io.ByteArrayOutputStream +import java.io.IOException +import java.util.* + +class CameraActivity : AppCompatActivity(), SurfaceHolder.Callback, Camera.PreviewCallback { + + lateinit var mSurfaceHolder: SurfaceHolder + lateinit var mCamera: Camera + private var cameraId = 1 + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + requestWindowFeature(Window.FEATURE_NO_TITLE); + window.setFlags( + WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN + ) + setContentView(R.layout.cameraaty) + + mSurfaceHolder = surfaceView.holder + mSurfaceHolder.addCallback(this) + iv_back.setOnClickListener { + try { + mCamera.setPreviewCallback(null) + mCamera.stopPreview() + mCamera.release() + } catch (e: Exception) { + } + finish() + } + } + + //翻转摄像机 + fun cameraSwitch() { + cameraId = if (cameraId == 1) 0 else 1 + mCamera.setPreviewCallback(null) + mCamera.stopPreview() + mCamera.release() + CameraOpen() + } + + + //打开照相机 + fun CameraOpen() { + try { + //打开摄像机 + mCamera = Camera.open(cameraId) + mCamera.setDisplayOrientation(90) + //绑定Surface并开启预览 + mCamera.setPreviewDisplay(mSurfaceHolder) + val parameters = mCamera.parameters +// val focusModes = parameters.supportedFocusModes +// val size = calculatePerfectSize( +// parameters.supportedPreviewSizes, +// 1024, 1024 +// ) +// surfaceView.layoutParams.width = size!!.width +// surfaceView.layoutParams.height = size.height +// +// parameters.setPreviewSize(size.width, size.height) + parameters.focusMode = "fixed" + mCamera.parameters = parameters + mCamera.startPreview() + mCamera.setPreviewCallback(this) + iv_change.setOnClickListener { cameraSwitch() } + } catch (e: IOException) { + mCamera.release() + Toast.makeText(this, "视图创建失败", Toast.LENGTH_SHORT).show() + } + } + + override fun surfaceChanged(holder: SurfaceHolder?, format: Int, width: Int, height: Int) { + val parameters = mCamera.parameters + mCamera.parameters = parameters + mCamera.startPreview() + } + + /** + * 计算最完美的Size + * @param sizes + * @param expectWidth + * @param expectHeight + * @return + */ + fun calculatePerfectSize( + sizes: List, expectWidth: Int, + expectHeight: Int + ): Camera.Size? { + sortList(sizes) // 根据宽度进行排序 + var result = sizes[0] + var widthOrHeight = false // 判断存在宽或高相等的Size + // 辗转计算宽高最接近的值 + for (size in sizes) { + // 如果宽高相等,则直接返回 + if (size.width == expectWidth && size.height == expectHeight) { + result = size + break + } + // 仅仅是宽度相等,计算高度最接近的size + if (size.width == expectWidth) { + widthOrHeight = true + if (Math.abs(result.height - expectHeight) + > Math.abs(size.height - expectHeight) + ) { + result = size + } + } else if (size.height == expectHeight) { + widthOrHeight = true + if (Math.abs(result.width - expectWidth) + > Math.abs(size.width - expectWidth) + ) { + result = size + } + } else if (!widthOrHeight) { + if (Math.abs(result.width - expectWidth) + > Math.abs(size.width - expectWidth) + && Math.abs(result.height - expectHeight) + > Math.abs(size.height - expectHeight) + ) { + result = size + } + } + } + return result + } + + /** + * 排序 + * @param list + */ + private fun sortList(list: List) { + Collections.sort(list, object : Comparator { + + override fun compare(pre: Camera.Size?, after: Camera.Size?): Int { + if (pre!!.width > after!!.width) { + return 1 + } else if (pre.width < after.width) { + return -1 + } + return 0 + } + }) + } + + + override fun surfaceDestroyed(holder: SurfaceHolder?) { + mCamera.stopPreview() + mCamera.release() + } + + + override fun surfaceCreated(holder: SurfaceHolder?) { + CameraOpen() + } + + @SuppressLint("SetTextI18n") + override fun onPreviewFrame(data: ByteArray?, camera: Camera?) { + mCamera.addCallbackBuffer(data) + + val size = mCamera.parameters.previewSize; + val image = YuvImage(data, ImageFormat.NV21, size.width, size.height, null); + val stream = ByteArrayOutputStream() + image.compressToJpeg(Rect(0, 0, size.width, size.height), 80, stream) + val bmp = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size()) + bmp.getNsfwScore() + val spText = bmp.getNsfwScore().toString().split(",") + textView.text = spText[0] + "\n" + spText[1] + stream.close() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/open_nsfw_android/view/MainAty.kt b/app/src/main/java/com/example/open_nsfw_android/view/MainAty.kt index 6b69ff3d..f39972c5 100644 --- a/app/src/main/java/com/example/open_nsfw_android/view/MainAty.kt +++ b/app/src/main/java/com/example/open_nsfw_android/view/MainAty.kt @@ -1,9 +1,11 @@ package com.example.open_nsfw_android.view import android.Manifest +import android.annotation.SuppressLint import android.content.Intent import android.content.pm.PackageManager import android.graphics.BitmapFactory +import android.graphics.Camera import android.os.Bundle import android.support.v4.app.ActivityCompat import android.support.v4.content.ContextCompat @@ -13,6 +15,7 @@ import android.widget.Toast import com.example.open_nsfw_android.R import com.example.open_nsfw_android.util.MainAdapter import com.example.open_nsfw_android.util.MyNsfwBean +import com.example.open_nsfw_android.util.PackageUtils import com.luck.picture.lib.PictureSelector import com.luck.picture.lib.config.PictureConfig import com.luck.picture.lib.config.PictureMimeType @@ -36,6 +39,7 @@ class MainAty : AppCompatActivity() { } + @SuppressLint("SetTextI18n") fun init() { //检测权限 checkPermissions() @@ -47,6 +51,18 @@ class MainAty : AppCompatActivity() { bt_sc_from_other.setOnClickListener { selectImgFromD() } //跳转网络图片识别页面 bt_sc_from_internet.setOnClickListener { startActivity(Intent(this, Main2Activity::class.java)) } + //实时扫描 + bt_sc_from_cam.setOnClickListener { scCamera() } + tv_version.text = "当前版本号:${PackageUtils.getVersionName(this)}" + } + + + /** + * 实时扫描 + */ + private fun scCamera() { + + startActivity(Intent(this, CameraActivity::class.java)) } @@ -97,6 +113,7 @@ class MainAty : AppCompatActivity() { }).start() } + private fun addDataToAdapter(mMyNsfwBean: MyNsfwBean) { runOnUiThread { mMainAdapter.addData(mMyNsfwBean) } } @@ -112,6 +129,15 @@ class MainAty : AppCompatActivity() { ) { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 1); } + + if (ContextCompat.checkSelfPermission( + this, + Manifest.permission.CAMERA + ) != PackageManager.PERMISSION_GRANTED + ) { + ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), 1); + } + } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { diff --git a/app/src/main/res/drawable/ch.xml b/app/src/main/res/drawable/ch.xml new file mode 100644 index 00000000..841bdd4f --- /dev/null +++ b/app/src/main/res/drawable/ch.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/change_background.xml b/app/src/main/res/drawable/change_background.xml new file mode 100644 index 00000000..ca3826a4 --- /dev/null +++ b/app/src/main/res/drawable/change_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_arrow_back_black_24dp.xml b/app/src/main/res/drawable/ic_arrow_back_black_24dp.xml new file mode 100644 index 00000000..63cb8d91 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_back_black_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_camera_black_24dp.xml b/app/src/main/res/drawable/ic_camera_black_24dp.xml new file mode 100644 index 00000000..7a5c6cfb --- /dev/null +++ b/app/src/main/res/drawable/ic_camera_black_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 086532fa..700b643e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -31,6 +31,27 @@ android:padding="15dp" android:text="从相册选取"/> + + + + + + + +