1

In fragment Image capture from camera and upload to server using volley,

When I capture Image and try to set it at Image view it throw following error.

       11-04 22:44:56.811 3958-3958/? E/libprocessgroup: failed to make 
      and chown /acct/uid_10058: Read-only file system
      11-04 22:45:24.711 3958-3958/com.example.tc E/AndroidRuntime: 
      FATAL 
      EXCEPTION: main
      Process: com.example.tc, PID: 3958
      java.lang.RuntimeException: Failure delivering result 
      ResultInfo{who=null, request=67424, result=-1, data=Intent { 
      act=inline-data (has extras) }} to activity 
      {com.example.tc/com.example.tc.MainActivity}: 
      java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageBitmap(android.graphics.Bitmap)' on a null object reference
......
.......
.......

        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

After a suggestion bellow in comment and in answer above error was fixed but another error occurred

error code is below

2019-11-05 03:28:50.459 1380-2430/com.example.tc E/Volley: [1889] NetworkDispatcher.processRequest: Unhandled exception java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream)' on a null object reference
    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream)' on a null object reference
        at com.example.tc.ui.slideshow.SlideshowFragment.getStringImage(SlideshowFragment.java:143)
        at com.example.tc.ui.slideshow.SlideshowFragment$2$3.getParams(SlideshowFragment.java:102)
        at com.android.volley.Request.getBody(Request.java:464)
        at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:275)
        at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:249)
        at com.android.volley.toolbox.HurlStack.executeRequest(HurlStack.java:94)
        at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:123)
        at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:131)
        at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:111)
        at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:90)

above error indicate following lines

bm.compress(Bitmap.CompressFormat.JPEG, 100, ba);
String image = getStringImage(photo);

Following is XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">


<Button
    android:id="@+id/bClick"
    android:layout_width="300dp"
    android:layout_height="wrap_content"
    android:layout_below="@id/imgMain"
    android:text="Click" />

<Button
    android:id="@+id/bUpload"
    android:layout_width="300dp"
    android:layout_height="wrap_content"
    android:layout_below="@id/bClick"
    android:text="Upload" />

<ImageView
    android:id="@+id/imgMain"
    android:layout_width="300dp"
    android:layout_height="300dp"
    tools:srcCompat="@tools:sample/avatars[3]" />

and following is UPDATED Java file

public class SlideshowFragment extends Fragment {

    private SlideshowViewModel slideshowViewModel;

    ImageView imgMain;
    Button bClick, bUpload;
    Bitmap photo;

    private static final String URL = "http://192.168.43.215/greetingsImage.php";
    private static final int CAMERA_REQUEST = 1888;


    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        View root = inflater.inflate(R.layout.fragment_slideshow, container, false);
        imgMain = root.findViewById(R.id.imgMain);
        final Button bClick = root.findViewById(R.id.bClick);
        final Button bUpload = root.findViewById(R.id.bUpload);

        bClick.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(cameraIntent, CAMERA_REQUEST);
            }
        });

        bUpload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        String s = response.trim();
                        if (!s.equalsIgnoreCase("Loi")) {
                            Toast.makeText(getActivity(), "Uploaded!", Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(getActivity(), "Failed Uploaded!", Toast.LENGTH_SHORT).show();
                        }

                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(getActivity(), error.toString(), Toast.LENGTH_SHORT).show();
                    }
                }) {
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        String image = getStringImage(photo);
                        Map<String, String> params = new HashMap<String, String>();
                        params.put("IMG", image);

                        return params;
                    }
                };
                RequestQueue requestQueue = Volley.newRequestQueue(getContext());
                requestQueue.add(stringRequest);
            }
        });


    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode==CAMERA_REQUEST){

            Bitmap photo = (Bitmap) data.getExtras().get("data");
            if (photo != null) {
                Toast.makeText(getActivity(), "Uploaded!", Toast.LENGTH_SHORT).show();
            }
            imgMain.setImageBitmap(photo);
        }
    }

    public String getStringImage(Bitmap bm){
        ByteArrayOutputStream ba = new ByteArrayOutputStream();
        bm.compress(Bitmap.CompressFormat.JPEG, 100, ba);
        byte[] imagebyte = ba.toByteArray();
        String encode = Base64.encodeToString(imagebyte, Base64.DEFAULT);
        return encode;
    }
}

in above code when I comment following line then It upload a zero byte image.

        bm.compress(Bitmap.CompressFormat.JPEG, 100, ba);
Hemant Maurya
  • 119
  • 1
  • 4
  • 13
  • 1
    Because you have not initialized `imgMain`.The local `imgMain` variable inside `onCreateView()` has nothing to do with member variable `imgMain` – Mohammad Sianaki Nov 04 '19 at 18:19

1 Answers1

1

change this line final ImageView imgMain = root.findViewById(R.id.imgMain); with

imgMain = root.findViewById(R.id.imgMain);
Djaf
  • 256
  • 1
  • 6
  • I applied your suggested changes and it worked but another error occurred, please recheck edited question. – Hemant Maurya Nov 04 '19 at 22:34
  • Did you check is your image null? photo is null probably Bitmap photo = (Bitmap) data.getExtras().get("data"); if (photo != null) { Toast.makeText(getActivity(), "Uploaded!", Toast.LENGTH_SHORT).show(); } imgMain.setImageBitmap(photo); here you create a new instance of photo which got nothing to do with Bitmap photo which you declared on top. In this piece of code in onactivityresult just try to remove Bitmap photo from bitmap so it goes – Djaf Nov 04 '19 at 22:41
  • photo = (Bitmap) data.getExtras().get("data"); if (photo != null) { Toast.makeText(getActivity(), "Uploaded!", Toast.LENGTH_SHORT).show(); } imgMain.setImageBitmap(photo); – Djaf Nov 04 '19 at 22:41
  • Yes it worked :) can you tell me what is difference between? Image quality is very low, can you suggest how can I improve it? – Hemant Maurya Nov 04 '19 at 22:57
  • 1
    It would be best if you could save it in PNG format because PNG is loseless you can find more reference here: https://stackoverflow.com/questions/16745489/how-to-keep-image-quality-same-in-bitmapfactory and https://stackoverflow.com/questions/28424942/decrease-image-size-without-losing-its-quality-in-android – Djaf Nov 04 '19 at 23:28