关于用Android Studio开发一个APP在调用相机时,取不到设备,哪位HarmonyOS鸿蒙Next大侠给看看?谢谢!

关于用Android Studio开发一个APP在调用相机时,取不到设备,哪位HarmonyOS鸿蒙Next大侠给看看?谢谢!

package com.example.mylocation

import android.Manifest
import android.animation.ObjectAnimator
import android.app.Activity
import android.content.Context
import android.content.Intent
import com.example.mylocation.R
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.location.Geocoder
import android.location.Location
import android.location.LocationListener
import android.location.LocationManager
import android.media.ExifInterface
import android.os.Build
import android.os.Bundle
import android.os.CancellationSignal
import android.os.Environment
import android.provider.MediaStore
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.Button
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.view.WindowCompat
import com.example.mylocation.R.menu.menu_main
import com.example.mylocation.databinding.ActivityMainBinding
import com.google.android.gms.tasks.OnSuccessListener
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale

class MainActivity : AppCompatActivity(), OrientationProvider.OnOrientationChangeListener {

    private lateinit var binding: ActivityMainBinding
    private lateinit var locationTracker: LocationTracker
    private lateinit var orientationProvider: OrientationProvider
    private var lastazimuth: Float = 0F

    private val REQUEST_IMAGE_CAPTURE = 1
    private val REQUEST_LOCATION_PERMISSION = 2

    private lateinit var locationManager: LocationManager
    private var currentLocation: Location? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        locationTracker = LocationTracker(this) { location ->
            val latitude = location.latitude
            val longitude = location.longitude
            val altitude = location.altitude
            val locationStr = """
                经度: ${locationTracker.convertDMS(longitude, true)}
                纬度:${locationTracker.convertDMS(latitude, false)}
                高程:${String.format("%.1f", altitude)}
                """.trimIndent()
            binding.textViewLocation.text = locationStr

            val speedMs = location.speed
            val speedKmh = speedMs * 3.6
            val speedStr =""" 
                速度:${String.format("%.2f", speedKmh)}
                """.trimIndent()
            binding.textViewSpeed.text = speedStr

            val geocoder = Geocoder(this, Locale.getDefault())
            try {
                val addresses = geocoder.getFromLocation(latitude, longitude, 1)

                if (!addresses.isNullOrEmpty()) {
                    val address = addresses[0]
                    val addressStr ="""
            地址:${address.getAddressLine(0)}
            """.trimIndent()
                    binding.textViewAdress.text=addressStr
                }
            } catch (e: IOException) {
                // Handle the exception.
            }
        }

        orientationProvider = OrientationProvider(this).apply {
            onOrientationChangeListener = this@MainActivity
        }

        locationTracker.startLocationUpdates()

        val takePhotoButton = findViewById<Button>(R.id.button_Takephoto)
        takePhotoButton.setOnClickListener { checkPermissionsAndTakePhoto() }
    }

    private val takePictureLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            val imageBitmap = result.data?.extras?.get("data") as Bitmap

            val file = createImageFile(imageBitmap)

            val exif = ExifInterface(file.absolutePath)
            exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, currentLocation?.latitude.toString())
            exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, currentLocation?.longitude.toString())
            exif.setAttribute(ExifInterface.TAG_GPS_IMG_DIRECTION, orientationProvider.azimuthDegrees.toString())
            exif.saveAttributes()
        }
    }

    private val locationListener: LocationListener = object : LocationListener {
        override fun onLocationChanged(location: Location) {
            currentLocation = location
        }
    }

    private fun checkPermissionsAndTakePhoto() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
            || ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
            || ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(
                this,
                arrayOf(
                    Manifest.permission.CAMERA,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    Manifest.permission.ACCESS_FINE_LOCATION
                ),
                REQUEST_LOCATION_PERMISSION
            )
        } else {
            takePhoto()
        }
    }

    private fun takePhoto() {
        Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
            if (takePictureIntent.resolveActivity(packageManager) != null) {
                takePictureLauncher.launch(takePictureIntent)
            } else {
                Log.w("MainActivity", "No camera app found")
            }
        }
    }

    private fun createImageFile(bitmap: Bitmap): File {
        val fileName = "IMG_" + SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date())
        val storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
        val image = File.createTempFile(fileName, ".jpg", storageDir)

        val fos = FileOutputStream(image)
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos)
        fos.close()

        return image
    }

    override fun onResume() {
        super.onResume()
        orientationProvider.startListening()
    }

    override fun onPause() {
        super.onPause()
        orientationProvider.stopListening()
    }

    override fun onOrientationChange(azimuthDegrees: Float?, pitchDegrees: Float?, rollDegrees: Float?) {
        val azimuthStr =""" 
            方位角: ${String.format("%.0f",azimuthDegrees)}
            """.trimIndent()
        binding.textViewAzimuth.text = azimuthStr

        val pitchStr =""" 
            倾斜角: ${String.format("%.0f",pitchDegrees)}
            """.trimIndent()
        binding.textViewPitch.text = pitchStr
        val rollStr =""" 
            滚动角: ${String.format("%.0f",rollDegrees)}
            """.trimIndent()
        binding.textViewRoll.text = rollStr

        if (azimuthDegrees != null) {
            val pictureAngle = azimuthDegrees*(-1f)
            if (pictureAngle < 0) {
                pictureAngle += 360f
            }
            val animator = ObjectAnimator.ofFloat(binding.ImageViewCompass, View.ROTATION,lastazimuth ,pictureAngle )
            animator.duration = 1000
            animator.start()
            lastazimuth=pictureAngle
        }
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(menu_main, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.action_settings -> true
            else -> super.onOptionsItemSelected(item)
        }
    }
}

更多关于关于用Android Studio开发一个APP在调用相机时,取不到设备,哪位HarmonyOS鸿蒙Next大侠给看看?谢谢!的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next系统中,使用Android Studio开发APP时调用相机取不到设备,可能是由于以下原因:

  1. 权限问题:确保在AndroidManifest.xml中声明了相机权限:

    <uses-permission android:name="android.permission.CAMERA" />
    

    并在运行时动态请求相机权限。

  2. 设备兼容性:鸿蒙Next系统可能与某些Android设备的相机驱动不完全兼容,导致无法识别设备。检查设备是否支持标准Android相机API。

  3. API调用方式:鸿蒙Next系统对Android API的调用方式可能有所不同,确保使用标准的Camera2 API或CameraX库进行调用。

  4. 系统版本差异:鸿蒙Next系统与Android系统在底层实现上存在差异,可能导致某些API行为不一致。检查鸿蒙Next系统的API文档,确保调用方式符合系统要求。

  5. 日志排查:通过Logcat查看相关日志,检查是否有权限拒绝、设备未找到等错误信息。

  6. 模拟器问题:如果在鸿蒙Next模拟器上测试,确保模拟器支持相机功能,并正确配置了相机设备。

  7. 设备连接:确保设备通过USB正确连接,并启用了开发者模式和USB调试。

  8. 系统更新:检查设备是否运行最新的鸿蒙Next系统版本,某些问题可能已在更新中修复。

如果以上方法仍无法解决问题,建议查阅鸿蒙Next系统的官方开发文档,或参考相关社区讨论。

更多关于关于用Android Studio开发一个APP在调用相机时,取不到设备,哪位HarmonyOS鸿蒙Next大侠给看看?谢谢!的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在Android Studio开发APP时,调用相机取不到设备,可能是以下原因:

  1. 权限问题:确保在AndroidManifest.xml中声明了相机权限:

    <uses-permission android:name="android.permission.CAMERA" />
    

    并在运行时请求权限。

  2. 设备兼容性:检查设备是否支持相机功能,可以通过PackageManagerhasSystemFeature(PackageManager.FEATURE_CAMERA)方法验证。

  3. 相机API使用:确保正确使用CameraCamera2 API,并检查设备是否被其他应用占用。

  4. 鸿蒙系统兼容性:鸿蒙Next系统可能与Android API存在差异,建议查阅鸿蒙开发文档,确保API兼容性。

如果问题依旧,建议调试日志,检查具体错误信息。

回到顶部