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>