तस्वीर लेने के बाद ऐप अचानक क्रैश हो जाता है, स्क्रीन घुमाता है और गतिविधि पर वापस आ जाता है। मैं एक एंड्रॉइड ऐप बना रहा हूं जिसे एक तस्वीर लेने और स्ट्रिंग के रूप में डीबी में अपना मार्ग स्टोर करने की आवश्यकता है, मैंने आधिकारिक Google ट्यूटोरियल का पालन किया (https://developer.android.com/training/camera/photobasics#kotlin) मेरे अपने कैमरा ऐप को लागू किए बिना ऐसा करने के लिए। लेकिन जब मैं निम्नलिखित चरणों का पालन करता हूं तो मुझे एक समस्या आ रही है: • उस गतिविधि को खोलें जिसमें मीडिया डिस्पैचTakePictureIntent() का उपयोग करके फ़ोटो लेने का तर्क है • कैमरे को पोर्ट्रेट मोड में प्रारंभ करें। • स्क्रीन को हॉरिजॉन्टल/कैमरा से लैंडस्केप मोड में घुमाएं। • फोटो लें और "ओके" बटन पर टैप करें। • ऐप क्रैश हो जाता है।

लेकिन अगर कैमरा खुला होने पर फोन को घुमाया नहीं जाता है तो मैं अपनी इच्छानुसार कैप्चर फोटो का उपयोग कर सकता हूं।

मेरा कोड यह है:

   override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if(requestCode == CodigosDeSolicitud.ANADIR_FOTOGRAFIA && resultCode == Activity.RESULT_OK){
            setPic()
        }
    }

    @Throws(IOException::class)
    private fun createImageFile() : File{

        val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
        val storageDir : File = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
        return File.createTempFile(
                "JPEG_${timeStamp}_",
                ".jpg",
                storageDir
        ).apply {
            mCurrentPhotoPath = absolutePath
        }

    }

    private fun dispatchTakePicktureIntent(){
        Intent(MediaStore.ACTION_IMAGE_CAPTURE).also {takePictureIntent ->
            takePictureIntent.resolveActivity(packageManager)?.also {
                val photoFile : File? = try{
                    createImageFile()
                } catch (ex : IOException){
                    null
                }
                photoFile?.also {
                    val photoURI: Uri = FileProvider.getUriForFile(
                            this,
                            "com.kps.spart.android.fileprovider",
                            it
                    )
                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
                    startActivityForResult(takePictureIntent, CodigosDeSolicitud.ANADIR_FOTOGRAFIA)
                }
            }

        }
    }

    private fun setPic(){
        val targetW: Int = iconoUsuarioIV.width
        val targetH: Int = iconoUsuarioIV.height

        val bmOptions = BitmapFactory.Options().apply {
            inJustDecodeBounds = true
            BitmapFactory.decodeFile(mCurrentPhotoPath,this)
            val photoW: Int = outWidth
            val photoH: Int = outHeight

            val scaleFactor : Int = Math.min(photoW / targetW, photoH / targetH)

            inJustDecodeBounds = false
            inSampleSize = scaleFactor
            inPurgeable = true
        }

        val exif = ExifInterface(mCurrentPhotoPath)
        val orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_UNDEFINED)
        Toast.makeText(this@RegistrarUsuarioActivity,"Orientacion: " + orientation, Toast.LENGTH_SHORT).show()

        BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions)?.also { bitmap ->
            iconoUsuarioIV.setImageBitmap(bitmap)
        }

और मेरा लॉगकैट मुझे अगली त्रुटियां देता है:

Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1000, result=-1, data=null} to activity {com.kps.spart.moskimedicationreminder/com.kps.spart.moskimedicationreminder.RegistrarUsuarioActivity}: java.lang.ArithmeticException: divide by zero
    at android.app.ActivityThread.deliverResults(ActivityThread.java:4519)
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3777)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3845) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3065) 
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4950) 
    at android.app.ActivityThread.-wrap19(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1730) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:7000) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408) 
 Caused by: java.lang.ArithmeticException: divide by zero
    at com.kps.spart.moskimedicationreminder.RegistrarUsuarioActivity.setPic(RegistrarUsuarioActivity.kt:223)
    at com.kps.spart.moskimedicationreminder.RegistrarUsuarioActivity.onActivityResult(RegistrarUsuarioActivity.kt:170)
    at android.app.Activity.dispatchActivityResult(Activity.java:7630)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:4515)
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3777) 
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3845) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3065) 
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4950) 
    at android.app.ActivityThread.-wrap19(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1730) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:7000) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408) 

रुकावट बिंदुओं का उपयोग करते हुए मैंने पाया कि जब मैं फोटो लेते समय स्क्रीन को घुमाता हूं तो गतिविधि नष्ट हो जाती है लेकिन ऐसा क्यों होता है यदि मैं उस गतिविधि में नहीं हूं और मैं इस समस्या को कैसे हल कर सकता हूं?

1
Eduardo Corona 2 फरवरी 2019, 23:58

1 उत्तर

सबसे बढ़िया उत्तर

मैंने खुद इस पर ठोकर खाई है (उसी गाइड का पालन करते हुए)। मुझे पता है कि सवाल पुराना है, लेकिन मैं किसी अन्य के लिए समाधान पोस्ट कर रहा हूं जो इसके पार आ सकता है।

समस्या onCreate विधि में है जिसे दो बार कहा जाता है (जब आप डिवाइस घुमाने के बाद तस्वीर लेने के बाद गतिविधि पर वापस आते हैं)। इससे बचने के लिए, आपको dispatchTakePicktureIntent की दूसरी कॉल को रोकना चाहिए (जो मुझे लगता है कि आप अपनी onCreate विधि में करते हैं)।

मैंने इसे इस तरह कार्यान्वित किया है:

class TakePhotoActivity : AppCompatActivity() {

    private val captureRequestCode = 1
    private val captureState = "capture_in_progress"
    private val capturePhotoPath = "capture_photo_path"
    private var photoPath: String? = null
    private var captureInProgress: Boolean = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_take_photo)
        captureInProgress = savedInstanceState?.getBoolean(captureState) ?: false
        photoPath = savedInstanceState?.getString(capturePhotoPath)

        if(!captureInProgress){
            captureInProgress = true
            dispatchTakePictureIntent()
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        outState.putBoolean(captureState, captureInProgress)
        outState.putString(capturePhotoPath, photoPath)
        super.onSaveInstanceState(outState)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == captureRequestCode && resultCode == RESULT_OK) {
            user_photo.adjustViewBounds = true
            val imgFile = File(photoPath ?: "")

            if (imgFile.exists()) {
                val myBitmap = BitmapFactory.decodeFile(imgFile.absolutePath)
                user_photo.setImageBitmap(myBitmap)
                runImageLabelingOnCurrentPicture(myBitmap)
            }
            captureInProgress = false
        }
    }
}

आपको फ्लैग 'टेकिंग पिक्चर इन प्रोसेस' को savedInstanceState में सहेजना होगा और onCreate विधि में मौजूद होने पर इसे पुनर्स्थापित करना होगा। बस इतना ही।

1
Webfreak 20 जिंदा 2020, 20:43