androidfirebasefirebase-storageactivity-state

Image not retaining on rotating the screen


I am trying to add an image from the gallery to an image view. It has been added but the image is disappearing from the image view on rotating the screen. The image has been saved to firebase. How to save the activity state? I have searched for it but did not find the relevant answer.Can anyone help me out to solve the problem.

public class skcreateac extends AppCompatActivity 
{
static final int PICK_IMAGE_REQUEST = 1;

private EditText sketac1;
private EditText sksetac1;
private EditText sketac2;
private EditText sketac3;
private EditText sketac4;
private EditText sketac5;
private Button skbt;
private Spinner spac;
private ImageView skimg;
private StorageReference skdbimg, fp;
private Firebase skrootac1;
private String strsk, skurl;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_skcreateac);
    spac = (Spinner)findViewById(R.id.spinner2);
    String cities[] = new String[]{"Hyderabad", "Warangal"};
    ArrayAdapter<String> cityadapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, cities);
    spac.setAdapter(cityadapter);
    skimg = (ImageView) findViewById(R.id.skimg);
    skdbimg = FirebaseStorage.getInstance().getReference();

    sketac1 = (EditText) findViewById(R.id.skonac);
    sksetac1 = (EditText) findViewById(R.id.sksncac);
    sketac2 = (EditText) findViewById(R.id.skphcac);
    sketac3 = (EditText) findViewById(R.id.sksaddress);
    sketac4 = (EditText) findViewById(R.id.skpwcac);
    sketac5 = (EditText) findViewById(R.id.skpwrcac);
    skbt = (Button) findViewById(R.id.bsu);

    strsk = getIntent().getExtras().getString("value");
    String url1 = "https://my-app2-a14eb.firebaseio.com/Shopkeepers/";
    String url2 = strsk;
    skurl = url1 + url2;
    skrootac1 = new Firebase(skurl);

    skimg.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent skimg = new Intent(Intent.ACTION_PICK);
            skimg.setType("image/*");
            startActivityForResult(skimg, PICK_IMAGE_REQUEST);

        }
    });

    skbt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String s1 = sketac1.getText().toString();
            if (sketac1.getText().length() == 0) {
                sketac1.setError("Kindly enter your Name");
            }
            Firebase childac1 = skrootac1.child("Name");
            childac1.setValue(s1);

            String ss1 = sksetac1.getText().toString();
            if (sksetac1.getText().length() == 0) {
                sksetac1.setError("Kindly enter your ShopName");
            }
            Firebase childsac1 = skrootac1.child("ShopName");
            childsac1.setValue(ss1);

            String s2 = sketac2.getText().toString();
            long i = Long.parseLong(s2);
            int j = 0;
            while (i > 0) {
                i = i / 10;
                j++;
            }
            if (j == 10) {
                Firebase childac2 = skrootac1.child("Phone");
                childac2.setValue(s2);
            } else {
                Toast.makeText(skcreateac.this, "Enter valid Mobile number", Toast.LENGTH_LONG).show();

            }
            String s3 = spac.getSelectedItem().toString();
            Firebase childac3 = skrootac1.child("City");
            childac3.setValue(s3);


            String s4 = sketac3.getText().toString();
            Firebase childac4 = skrootac1.child("Address");
            childac4.setValue(s4);

            String s5 = sketac4.getText().toString();
            String s6 = sketac5.getText().toString();
            if (s5.equals(s6)) {
                Firebase childac5 = skrootac1.child("Password");
                childac5.setValue(s5);
            } else {
                Toast.makeText(skcreateac.this, "Confirm Password field doesnot match with Create Password field", Toast.LENGTH_LONG).show();
            }

        }
    });


}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK) {
        final Uri uri = data.getData();
        fp = skdbimg.child("SKPhotos").child(strsk);
        fp.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                Picasso.get().load(uri).fit().centerCrop().into(skimg);
                Toast.makeText(skcreateac.this, "Uploaded photo", Toast.LENGTH_LONG).show();

            }
        });
    }
}

Solution

  • Add following -

    @Override
    protected void onSaveInstanceState (Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putParcelable("outputFileUri", photoURI);
    }
    

    Make a private URI photoURI = null; in your activity.

    Then in your onCreate() add do

        @Override
        protected void onCreate(Bundle savedInstanceState){
            // your other codes
            skrootac1 = new Firebase(skurl); 
            // your other codes
            if (savedInstanceState != null)
            {
                photoURI= savedInstanceState.getParcelable("outputFileUri");
                setImage(photoURI);
    
            }
    
        }
        private void setImage(final Uri uri){
                fp = skdbimg.child("SKPhotos").child(strsk);
                fp.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        Picasso.get().load(uri).fit().centerCrop().into(skimg);
                        Toast.makeText(skcreateac.this, "Uploaded photo", Toast.LENGTH_LONG).show();
    
                    }
                });
        }
    

    And finally, change your onActivityResult()

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK) {
            photoURI = data.getData();
            setImage(photoURI);
        }
    }