简体   繁体   中英

ImageUri is Null when passing Thumbnail (Bitmap) as Intent for onActivityResult

I've been stuck on this line of code for days now. I have an ImageButton that starts a Camera intent, saves a photo, the sets a Bitmap Thumbnail of the photo to the ImageButton. I eventually want this photo to be displayed in a Google Maps marker InfoWindow.

Here's my Report Activity that starts the Camera intent and tries to pass the thumbnail to the InfoWindow class (that creates the content within the infowindow for the marker)

import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.location.Location;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.TextView;

import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.LatLng;

public class FoundPetReport extends AppCompatActivity {
    public GoogleMap mMap;
    public static final int REQUEST_TAKE_PHOTO = 1;
    public static final int SCREEN_ORIENTATION_LANDSCAPE = 0;
    private Spinner spinner1, spinner2;
    private ImageButton imageButton;
    private Button buttonLocation;
    private Button btnSubmit;
    private ImageButton btnCamera;
    private ImageView imageViewCamera;
    private TextView place_details;
    static final int REQUEST_IMAGE_CAPTURE = 1;
    private String s;
    public Uri imageUri;
    public Object imageurl;
    public static final int PICTURE_RESULT = 0;


    private static final String TAG = FoundPetReport.class.getSimpleName();

    private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 34;

    private static final String ADDRESS_REQUESTED_KEY = "address-request-pending";
    private static final String LOCATION_ADDRESS_KEY = "location-address";

    /**
     * Provides access to the Fused Location Provider API.
     */
    private FusedLocationProviderClient mFusedLocationClient;


    /**
     * Represents a geographical location.
     */
    public Location mLastLocation;

    /**
     * Tracks whether the user has requested an address. Becomes true when the user requests an
     * address and false when the address (or an error message) is delivered.
     */
    private boolean mAddressRequested;

    /**
     * The formatted location address.
     */
    private String mAddressOutput;

    /**
     * Receiver registered with this activity to get the response from FetchAddressIntentService.
     */

    /**
     * Displays the location address.
     */
    private TextView mLocationAddressTextView;
    private FusedLocationProviderClient mFusedLocationProviderClient;

    /**
     * Visible while the address is being fetched.
     */
    private ProgressBar mProgressBar;

    /**
     * Kicks off the request to fetch an address when pressed.
     */
    private Button mFetchAddressButton;

    String newaddress;

    public LatLng location;
    private LatLng position;



    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.foundpet);

        addListenerOnButton();
        addListenerOnSpinnerItemSelection();


        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.TITLE, "New Picture");
        values.put(MediaStore.Images.Media.DESCRIPTION, "From your Camera");
        imageUri = getContentResolver().insert(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        Log.d("imageUri", String.valueOf(imageUri));

        if (savedInstanceState == null) {
            Bundle extras = getIntent().getExtras();
            if (extras == null) {
                newaddress = null;
                location = null;
            } else {
                newaddress = extras.getString("address");
                location = extras.getParcelable("location");

            }
        } else {
            newaddress = (String) savedInstanceState.getSerializable("address");
            location = (LatLng) savedInstanceState.getParcelable("location");
        }
        newaddress = getIntent().getStringExtra("address");
        TextView place_details = (TextView) findViewById(R.id.place_details);
        place_details.setText(newaddress);


        ImageButton imageButton = (ImageButton) findViewById(R.id.imageButton);
        imageButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(intent, PICTURE_RESULT);
            }
        });
    }

    // add items into spinner dynamically

    public void addListenerOnSpinnerItemSelection() {
        spinner1 = (Spinner) findViewById(R.id.spinner1);
        spinner1.setOnItemSelectedListener(new CustomOnItemSelectedListener());
    }

    // get the selected dropdown list value
    public void addListenerOnButton() {

        spinner1 = (Spinner) findViewById(R.id.spinner1);
        spinner2 = (Spinner) findViewById(R.id.spinner2);
        btnSubmit = (Button) findViewById(R.id.btnSubmit);

        btnSubmit.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent2 = new Intent(FoundPetReport.this, NewReportedMarkerFound.class);
                intent2.putExtra("address", newaddress);
                startActivity(intent2);
            }
        });
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putParcelable("imageUri", imageUri);
    }


    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {

        ImageButton imageButton = (ImageButton) findViewById(R.id.imageButton);
        switch (requestCode) {

            case PICTURE_RESULT:
                if (resultCode == Activity.RESULT_OK) {
                    try {

                        Bitmap thumbnail = MediaStore.Images.Media.getBitmap(
                                getContentResolver(), imageUri);
                        Log.d("thumbnail", String.valueOf(thumbnail.getWidth() + " " + thumbnail.getHeight()));
                        imageButton.setImageBitmap(thumbnail);
                        imageurl = getRealPathFromURI(imageUri);
                        Log.d("imageurl", imageurl.toString());
                        imageUri = intent.getData();

                        Intent photoIntent = new Intent(FoundPetReport.this, CustomInfoWindowAdapter.class);
                        photoIntent.putExtra("photo", thumbnail);

                        startActivity(photoIntent);


                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                }
        }

    }


    public String getRealPathFromURI(Uri contentUri) {
        String[] proj = {MediaStore.Images.Media.DATA};
        Cursor cursor = managedQuery(contentUri, proj, null, null, null);
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

}

Error:

D/thumbnail: 4032 2268
D/imageurl: /storage/emulated/0/Pictures/1528830788205.jpg
W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'android.net.Uri android.content.Intent.getData()' on a null object reference
W/System.err:     at com.example.barperetz.petfinder.FoundPetReport.onActivityResult(FoundPetReport.java:198)
W/System.err:     at android.app.Activity.dispatchActivityResult(Activity.java:7226)
W/System.err:     at android.app.ActivityThread.deliverResults(ActivityThread.java:4521)
W/System.err:     at android.app.ActivityThread.handleSendResult(ActivityThread.java:4568)
W/System.err:     at android.app.ActivityThread.-wrap22(ActivityThread.java)
W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1706)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err:     at android.os.Looper.loop(Looper.java:154)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6688)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

And just for clarity here's my InfoWindow class where I try to receive this Image and set it to the InfoWindow. Right now, the InfoWindow can display an ImageView, but since the ImageUri is Null it better gets passed to the InfoWindow:

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.Marker;


public class CustomInfoWindowAdapter extends AppCompatActivity implements GoogleMap.InfoWindowAdapter {


    private Activity context;
    public Bitmap thumbnail;
    public ImageView windowImage;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState == null) {
            Bundle extras = getIntent().getExtras();
            if (extras == null) {
                thumbnail = null;
            } else {
                thumbnail = extras.getParcelable("photo");
            }
            } else {
                thumbnail = (Bitmap) savedInstanceState.getParcelable("photo");

            }
        thumbnail = (Bitmap) getIntent().getExtras().get("photo");
        Log.d("thumbnailtwo", String.valueOf(thumbnail));
        }


    public CustomInfoWindowAdapter(Activity context){
        this.context = context;

    }

    @Override
    public View getInfoWindow(Marker marker) {
        return null;
    }

    @Override
    public View getInfoContents(Marker marker) {

        View view = context.getLayoutInflater().inflate(R.layout.custominfowindow, null);

        TextView tvTitle = (TextView) view.findViewById(R.id.pet_name);
        TextView tvSubTitle = (TextView) view.findViewById(R.id.pet_address);
        ImageView windowImage = (ImageView) view.findViewById(R.id.windowImage);

        windowImage.setImageBitmap(thumbnail);
        tvTitle.setText(marker.getTitle());
        tvSubTitle.setText(marker.getSnippet());

        return view;
    }
}

As discussed under Starting Activities , when you call startActivityForResult() , the called activity "can optionally return back an Intent containing any additional data it wants."

The error message you're getting says that the intent passed back is null, indicating that the called activity didn't return an intent.

The activity you're calling, using MediaStore.ACTION_IMAGE_CAPTURE , doesn't say anything in its documentation about returning an intent. Is there some reason you think it should?

If you need to get the imageUri back from the ACTION_IMAGE_CAPTURE activity, you might need to store it in SharedPreferences or something, and pass an index or hash of it via the requestCode parameter, so that you can recover it upon return.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM