Search code examples
androidfirebasekotlinactivity-transition

How can I set a request code under different conditions for my activity to bypass onActivityResult?


I have a program that allows me to store data(pictures and metadata with the taken picture) during the execution of a picture being taking with the android system camera activity... but I have code in place to make sure that the user enters data into a popup activity before the camera activity is displayed by using the OnActivityResult function(this way the user's photo has information that is stored as metadata in my firebase database). I was wondering If I can set a request code that wouldn't be equal to the REQUESTCODE2 so that under the condition that my back button is pressed(which will still result in the REQUESTCODE2 being returned for the com.example.myapplication.nameofphoto activity, which then will trigger takepic()) I can purposely make sure that the request code is faulty so that takepic() does not trigger and I don't store null data into my database.

for your information: nameofpersonvar , and nameofphotovar are both in a different class and is the information from the popup activity

private const val   REQUESTCODE = 2
private const val   REQUESTCODE2 = 3

fun take_pic(){
    val takephotoIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    if (takephotoIntent.resolveActivity(this.packageManager) != null) {
        startActivityForResult(takephotoIntent, REQUESTCODE)
    } else {
        Toast.makeText(this, "Unable To access Camera... ", Toast.LENGTH_LONG)
            .show()
    }


}
        photoButton.setOnClickListener {
            val action3 = Intent(this , com.example.myapplication.nameofphoto::class.java)
            startActivityForResult(action3, REQUESTCODE2 )

    }




override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (REQUESTCODE == requestCode && resultCode == Activity.RESULT_OK) {
            //Compressing the bitmap(image) into a byte[] to match the input of the .putbytes method
            val userimage = data?.extras?.get("data") as Bitmap
            val byteoutput = ByteArrayOutputStream()
            userimage.compress(Bitmap.CompressFormat.JPEG,100 , byteoutput)
            val data = byteoutput.toByteArray()
            //ref to the firebase "bucket" database
            val storageinfo = FirebaseStorage.getInstance().getReference("/Images" )
            //extra data that shows who the images belong to (users)

            val metadatastoreage = storageMetadata {
                setCustomMetadata("Name of person" , nameofpersonvar)
                setCustomMetadata("Name of photo" , nameofphotovar)}
           storageinfo.putBytes(data, metadatastoreage)



        }else if (requestCode ==REQUESTCODE2) {
            take_pic()

        }
        else {
            super.onActivityResult(requestCode, resultCode, data)
        }
        }

Solution

  • Then why don't you send some result code different from the back press method of the current activity opened and check if the result is successful then take pick otherwise do something.

    send this as result code from back press method. RESULT_CANCELED

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (REQUESTCODE == requestCode && resultCode == Activity.RESULT_OK) {
            //Compressing the bitmap(image) into a byte[] to match the input of the .putbytes method
            val userimage = data?.extras?.get("data") as Bitmap
            val byteoutput = ByteArrayOutputStream()
            userimage.compress(Bitmap.CompressFormat.JPEG,100 , byteoutput)
            val data = byteoutput.toByteArray()
            //ref to the firebase "bucket" database
            val storageinfo = FirebaseStorage.getInstance().getReference("/Images" )
            //extra data that shows who the images belong to (users)
    
            val metadatastoreage = storageMetadata {
                setCustomMetadata("Name of person" , nameofpersonvar)
                setCustomMetadata("Name of photo" , nameofphotovar)}
           storageinfo.putBytes(data, metadatastoreage)
           return
        }
    
       if (requestCode ==REQUESTCODE2 && resultcode == Activity.RESULT_OK) {
            take_pic()
       } else {
            //back pressed do something.
            //finish etc
        }
    }
    

    Edit: You can override the onBackPressed() in the popup activity and send some data using intent to the parent activity. for ex.

    Intent resultIntent = new Intent();
    // TODO Add extras or a data URI to this intent as appropriate.
    resultIntent.putExtra("user_pic_click", "some data");
    setResult(Activity.RESULT_OK, resultIntent);
    finish();