Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在默认相机应用程序中添加重叠视图样轮廓_Android_Kotlin - Fatal编程技术网

Android 如何在默认相机应用程序中添加重叠视图样轮廓

Android 如何在默认相机应用程序中添加重叠视图样轮廓,android,kotlin,Android,Kotlin,因此,我目前正在开发一个应用程序,该应用程序具有在相机预览中叠加视图或图像的功能。我尝试过以下代码: btn_Capture.setOnClickListener { //if system os is Marshmallow or Above, we need to request runtime permission if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ if (

因此,我目前正在开发一个应用程序,该应用程序具有在相机预览中叠加视图或图像的功能。我尝试过以下代码:

btn_Capture.setOnClickListener {
        //if system os is Marshmallow or Above, we need to request runtime permission
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            if (checkSelfPermission(Manifest.permission.CAMERA)
                == PackageManager.PERMISSION_DENIED ||
                checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_DENIED){
                //permission was not enabled
                val permission = arrayOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                //show popup to request permission
                requestPermissions(permission, PERMISSION_CODE)
            }
            else{
                //permission already granted
                showDialog()
                //openCamera()
            }
        }
        else{
            //system os is < marshmallow
            showDialog()
            //openCamera()
        }
    }

因此,我想在每次打开相机应用程序时覆盖一张图像。我还尝试创建自定义布局并将其附加到相机的父级,但它无法按我希望的方式工作。

因此我采用了这种方式

安卓清单

<?xml version="1.0" encoding="utf-8"?>


这是我的自定义相机活动

class CustomCamera2 : AppCompatActivity() {

   lateinit var newView: ImageView
   var pattern = "yyyy-MM-dd HH:mm:ss"
   var simpleDateFormat = SimpleDateFormat(pattern)
   var date = simpleDateFormat.format(Date())
   var fotoapparat: Fotoapparat? = null
   var filename = date + "Tema.png"
   val sd = Environment.getExternalStorageDirectory()
   val finalsd = sd.toString() + "/Pictures"
   var dest = File(finalsd, filename)
   var fotoapparatState : FotoapparatState? = null
   var cameraStatus : CameraState? = null
   var flashState: FlashState? = null
   val permissions = arrayOf(android.Manifest.permission.CAMERA, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE)

   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContentView(R.layout.content_custom_camera2)
       createFotoapparat()
       cameraStatus = CameraState.BACK
       flashState = FlashState.OFF
       fotoapparatState = FotoapparatState.OFF

       myview.setLayerType(View.LAYER_TYPE_SOFTWARE,null)

       fab_camera.setOnClickListener {
           takePhoto()
       }

       fab_switch_camera.setOnClickListener {
           switchCamera()
       }

       fab_flash.setOnClickListener {
           changeFlashState()
       }

   }

   private fun createFotoapparat(){
       val cameraView = findViewById<CameraView>(R.id.camera_view)

       fotoapparat = Fotoapparat(
           context = this,
           view = cameraView,
           scaleType = ScaleType.CenterCrop,
           lensPosition = back(),
           logger = loggers(
               logcat()
           ),
           cameraErrorCallback = { error ->
               println("Recorder errors: $error")
           }
       )
   }

   private fun changeFlashState() {
       fotoapparat?.updateConfiguration(
           CameraConfiguration(
              flashMode = if(flashState == FlashState.TORCH) off() else torch()
           )
       )

       if(flashState == FlashState.TORCH) flashState = FlashState.OFF
       else flashState = FlashState.TORCH
   }

   private fun switchCamera() {
       fotoapparat?.switchTo(
           lensPosition =  if (cameraStatus == CameraState.BACK) front() else back(),
           cameraConfiguration = CameraConfiguration()
       )

       if(cameraStatus == CameraState.BACK) cameraStatus = CameraState.FRONT
       else cameraStatus = CameraState.BACK
   }

   private fun takePhoto() {
       if (hasNoPermissions()) {
        requestPermission()
       }else{
           fotoapparat
               ?.takePicture()
               ?.saveToFile(dest)

           Handler().postDelayed(
               {
                   StartEdit()
               },
               1300 // value in milliseconds
           )

       }
   }

   fun StartEdit(){
       val dest2:String = dest.absolutePath.toString()
       val intent = Intent(this,EditActivity2::class.java)
       intent.putExtra("ImagePath", dest2)
       startActivity(intent)

       Toast.makeText(this,dest.toString(),Toast.LENGTH_LONG).show()
       pattern = "yyyy-MM-dd HH:mm:ss"
       simpleDateFormat = SimpleDateFormat(pattern)
       date = simpleDateFormat.format(Date())
       filename = date + "Tema.png"
       dest = File(finalsd, filename)
   }

   override fun onStart() {
       super.onStart()
       if (hasNoPermissions()) {
           requestPermission()
       }else{
           fotoapparat?.start()
           fotoapparatState = FotoapparatState.ON
       }
   }

   private fun hasNoPermissions(): Boolean{
       return ContextCompat.checkSelfPermission(this,
           Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this,
           Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this,
           Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
   }

   fun requestPermission(){
       ActivityCompat.requestPermissions(this, permissions,0)
   }

   override fun onStop() {
       super.onStop()
       fotoapparat?.stop()
       FotoapparatState.OFF
   }

   override fun onResume() {
       super.onResume()
       if(!hasNoPermissions() && fotoapparatState == FotoapparatState.OFF){
           val intent = Intent(baseContext, MainActivity::class.java)
           startActivity(intent)
           finish()
       }
   }

   enum class CameraState{
       FRONT, BACK
   }

   enum class FlashState{
       TORCH, OFF
   }

   enum class FotoapparatState{
       ON, OFF
   }
}
class CustomCamera2:AppCompatActivity(){
lateinit变量newView:ImageView
var pattern=“yyyy-MM-dd HH:MM:ss”
var simpleDateFormat=simpleDateFormat(模式)
var date=simpleDataFormat.format(日期())
变量fotoapparat:fotoapparat?=null
var filename=date+“Tema.png”
val sd=Environment.getExternalStorageDirectory()
val finalsd=sd.toString()+“/Pictures”
var dest=File(finalsd,文件名)
变量fotoapparatState:fotoapparatState?=null
var cameraStatus:CameraState?=null
var flashState:flashState?=null
val permissions=arrayOf(android.Manifest.permission.CAMERA、android.Manifest.permission.WRITE_外部_存储、android.Manifest.permission.READ_外部_存储)
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.content\u custom\u camera2)
createFotoapparat()
cameraStatus=CameraState.BACK
flashState=flashState.OFF
FOTOAPPARATE=FOTOAPPARATE.OFF
myview.setLayerType(View.LAYER\u TYPE\u软件,空)
fab_camera.setOnClickListener{
拍照
}
fab\u开关\u camera.setOnClickListener{
开关摄像机()
}
fab_flash.setOnClickListener{
changeFlashState()
}
}
私人娱乐createFotoapparat(){
val cameraView=findViewById(R.id.camera\U视图)
fotoapaprat=fotoapaprat(
上下文=这个,
视图=摄像机视图,
scaleType=scaleType.CenterCrop,
lensPosition=back(),
记录器=记录器(
logcat()
),
cameraErrorCallback={error->
println(“记录器错误:$error”)
}
)
}
私有状态(){
fotoapparat?更新配置(
摄像机配置(
flashMode=if(flashState==flashState.TORCH)off()else TORCH()
)
)
如果(flashState==flashState.TORCH)flashState=flashState.OFF
else flashState=flashState.TORCH
}
私人摄像机(){
fotoapparat?切换到(
lensPosition=if(cameraStatus==CameraState.BACK)front()else BACK(),
cameraConfiguration=cameraConfiguration()
)
如果(cameraStatus==CameraState.BACK)cameraStatus=CameraState.FRONT
else cameraStatus=CameraState.BACK
}
私人娱乐照{
if(hasnoppermissions()){
请求权限()
}否则{
福托阿帕拉
?拍摄照片()
?保存文件(目的地)
Handler().postDelayed(
{
StartEdit()
},
1300//以毫秒为单位的值
)
}
}
有趣的开始{
val dest2:String=dest.absolutePath.toString()
val intent=intent(这是EditActivity2::class.java)
intent.putExtra(“ImagePath”,dest2)
星触觉(意图)
Toast.makeText(this,dest.toString(),Toast.LENGTH\u LONG.show())
pattern=“yyyy-MM-dd HH:MM:ss”
SimpleDataFormat=SimpleDataFormat(模式)
日期=SimpleDataFormat.format(日期())
filename=date+“Tema.png”
dest=文件(finalsd,文件名)
}
覆盖有趣的onStart(){
super.onStart()
if(hasnoppermissions()){
请求权限()
}否则{
fotoapparat?.start()
FOTOAPPARATE=FOTOAPPARATE.ON
}
}
private fun hasnoppermissions():布尔值{
返回ContextCompat.checkSelfPermission(此,
Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.permission_grated | | | ContextCompat.checkSelfPermission(此,
Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.permission_grated | | | ContextCompat.checkSelfPermission(此,
Manifest.permission.CAMERA)!=已授予PackageManager.permission\u
}
请求权限()的乐趣{
ActivityCompat.requestPermissions(此,权限,0)
}
覆盖桌面上的乐趣(){
super.onStop()
fotoapparat?.stop()
FotoapparatState.OFF
}
重写onResume(){
super.onResume()
如果(!hasnoppermissions()&&fotoapparatState==fotoapparatState.OFF){
val intent=intent(baseContext,MainActivity::class.java)
星触觉(意图)
完成()
}
}
枚举类摄影机状态{
前面,后面
}
枚举类FlashState{
熄火
}
枚举类FotoapparatState{
开,关
}
}
这是我的Xml文件

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@id/relativelayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".MainActivity"
    android:background="@android:color/black">


    <io.fotoapparat.view.CameraView
        android:id="@+id/camera_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>



    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab_camera"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fabSize="normal"
        android:src="@drawable/camera"
        android:layout_alignParentBottom="true"
        android:layout_margin="32dp"
        android:layout_centerHorizontal="true"
        app:backgroundTint="@android:color/white"/>

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab_flash"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fabSize="normal"
        android:src="@drawable/torch"
        android:layout_alignParentBottom="true"
        android:layout_margin="32dp"
        app:backgroundTint="@android:color/white"/>

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab_switch_camera"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fabSize="normal"
        android:src="@drawable/palit"
        android:layout_alignParentBottom="true"
        android:layout_margin="32dp"
        android:layout_alignParentRight="true"
        app:backgroundTint="@android:color/white"/>

    <!--<com.google.android.material.transformation.TransformationChildLayout
        android:id="@+id/Hello"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/guidethree"/>-->

    <ImageView
        android:id="@+id/myview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/guidethree"/>


    </RelativeLayout>

我自己修好了。我使用Fotoapparat库,然后在清单文件中启用硬件加速,然后禁用将覆盖在相机预览顶部的图像的硬件加速
class CustomCamera2 : AppCompatActivity() {

   lateinit var newView: ImageView
   var pattern = "yyyy-MM-dd HH:mm:ss"
   var simpleDateFormat = SimpleDateFormat(pattern)
   var date = simpleDateFormat.format(Date())
   var fotoapparat: Fotoapparat? = null
   var filename = date + "Tema.png"
   val sd = Environment.getExternalStorageDirectory()
   val finalsd = sd.toString() + "/Pictures"
   var dest = File(finalsd, filename)
   var fotoapparatState : FotoapparatState? = null
   var cameraStatus : CameraState? = null
   var flashState: FlashState? = null
   val permissions = arrayOf(android.Manifest.permission.CAMERA, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE)

   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContentView(R.layout.content_custom_camera2)
       createFotoapparat()
       cameraStatus = CameraState.BACK
       flashState = FlashState.OFF
       fotoapparatState = FotoapparatState.OFF

       myview.setLayerType(View.LAYER_TYPE_SOFTWARE,null)

       fab_camera.setOnClickListener {
           takePhoto()
       }

       fab_switch_camera.setOnClickListener {
           switchCamera()
       }

       fab_flash.setOnClickListener {
           changeFlashState()
       }

   }

   private fun createFotoapparat(){
       val cameraView = findViewById<CameraView>(R.id.camera_view)

       fotoapparat = Fotoapparat(
           context = this,
           view = cameraView,
           scaleType = ScaleType.CenterCrop,
           lensPosition = back(),
           logger = loggers(
               logcat()
           ),
           cameraErrorCallback = { error ->
               println("Recorder errors: $error")
           }
       )
   }

   private fun changeFlashState() {
       fotoapparat?.updateConfiguration(
           CameraConfiguration(
              flashMode = if(flashState == FlashState.TORCH) off() else torch()
           )
       )

       if(flashState == FlashState.TORCH) flashState = FlashState.OFF
       else flashState = FlashState.TORCH
   }

   private fun switchCamera() {
       fotoapparat?.switchTo(
           lensPosition =  if (cameraStatus == CameraState.BACK) front() else back(),
           cameraConfiguration = CameraConfiguration()
       )

       if(cameraStatus == CameraState.BACK) cameraStatus = CameraState.FRONT
       else cameraStatus = CameraState.BACK
   }

   private fun takePhoto() {
       if (hasNoPermissions()) {
        requestPermission()
       }else{
           fotoapparat
               ?.takePicture()
               ?.saveToFile(dest)

           Handler().postDelayed(
               {
                   StartEdit()
               },
               1300 // value in milliseconds
           )

       }
   }

   fun StartEdit(){
       val dest2:String = dest.absolutePath.toString()
       val intent = Intent(this,EditActivity2::class.java)
       intent.putExtra("ImagePath", dest2)
       startActivity(intent)

       Toast.makeText(this,dest.toString(),Toast.LENGTH_LONG).show()
       pattern = "yyyy-MM-dd HH:mm:ss"
       simpleDateFormat = SimpleDateFormat(pattern)
       date = simpleDateFormat.format(Date())
       filename = date + "Tema.png"
       dest = File(finalsd, filename)
   }

   override fun onStart() {
       super.onStart()
       if (hasNoPermissions()) {
           requestPermission()
       }else{
           fotoapparat?.start()
           fotoapparatState = FotoapparatState.ON
       }
   }

   private fun hasNoPermissions(): Boolean{
       return ContextCompat.checkSelfPermission(this,
           Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this,
           Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this,
           Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
   }

   fun requestPermission(){
       ActivityCompat.requestPermissions(this, permissions,0)
   }

   override fun onStop() {
       super.onStop()
       fotoapparat?.stop()
       FotoapparatState.OFF
   }

   override fun onResume() {
       super.onResume()
       if(!hasNoPermissions() && fotoapparatState == FotoapparatState.OFF){
           val intent = Intent(baseContext, MainActivity::class.java)
           startActivity(intent)
           finish()
       }
   }

   enum class CameraState{
       FRONT, BACK
   }

   enum class FlashState{
       TORCH, OFF
   }

   enum class FotoapparatState{
       ON, OFF
   }
}
<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@id/relativelayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".MainActivity"
    android:background="@android:color/black">


    <io.fotoapparat.view.CameraView
        android:id="@+id/camera_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>



    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab_camera"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fabSize="normal"
        android:src="@drawable/camera"
        android:layout_alignParentBottom="true"
        android:layout_margin="32dp"
        android:layout_centerHorizontal="true"
        app:backgroundTint="@android:color/white"/>

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab_flash"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fabSize="normal"
        android:src="@drawable/torch"
        android:layout_alignParentBottom="true"
        android:layout_margin="32dp"
        app:backgroundTint="@android:color/white"/>

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab_switch_camera"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fabSize="normal"
        android:src="@drawable/palit"
        android:layout_alignParentBottom="true"
        android:layout_margin="32dp"
        android:layout_alignParentRight="true"
        app:backgroundTint="@android:color/white"/>

    <!--<com.google.android.material.transformation.TransformationChildLayout
        android:id="@+id/Hello"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/guidethree"/>-->

    <ImageView
        android:id="@+id/myview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/guidethree"/>


    </RelativeLayout>