तस्वीर लेने के बाद ऐप अचानक क्रैश हो जाता है, स्क्रीन घुमाता है और गतिविधि पर वापस आ जाता है। मैं एक एंड्रॉइड ऐप बना रहा हूं जिसे एक तस्वीर लेने और स्ट्रिंग के रूप में डीबी में अपना मार्ग स्टोर करने की आवश्यकता है, मैंने आधिकारिक 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 उत्तर
मैंने खुद इस पर ठोकर खाई है (उसी गाइड का पालन करते हुए)। मुझे पता है कि सवाल पुराना है, लेकिन मैं किसी अन्य के लिए समाधान पोस्ट कर रहा हूं जो इसके पार आ सकता है।
समस्या 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
विधि में मौजूद होने पर इसे पुनर्स्थापित करना होगा। बस इतना ही।
संबंधित सवाल
नए सवाल
android
एंड्रॉइड Google का मोबाइल ऑपरेटिंग सिस्टम है, जिसका उपयोग प्रोग्रामिंग या डिजिटल डिवाइस (स्मार्टफोन, टैबलेट, ऑटोमोबाइल्स, टीवी, वियर, ग्लास, IoT) को विकसित करने के लिए किया जाता है। एंड्रॉइड से संबंधित विषयों के लिए, एंड्रॉइड-विशिष्ट टैग जैसे कि एंड्रॉइड-इरादे, एंड्रॉइड-गतिविधि, एंड्रॉइड-एडॉप्टर आदि का उपयोग करें। विकास या प्रोग्रामिंग के अलावा अन्य प्रश्नों के लिए, लेकिन एंड्रॉइड फ्रेमवर्क से संबंधित हैं, इस लिंक का उपयोग करें: https: // android.stackexchange.com।