How to save image using Glide and recyclerView

Viewed 39

This is my recyclerview Adapter

class MyViewHolder extends RecyclerView.ViewHolder{
    ImageView memeImageView;
    ImageButton shareBtn, downLoadBtn;

    public MyViewHolder(@NonNull View itemView) {
        super(itemView);

        memeImageView=itemView.findViewById(R.id.memeImageViewId);
        shareBtn = itemView.findViewById(R.id.shareBtnId);
        downLoadBtn=itemView.findViewById(R.id.downloadBtnId);
    }
}

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
    private List <MyItem> myList;
    private Context context;

    public MyAdapter(List<MyItem> myList, Context context) {
        this.myList = myList;
        this.context = context;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
       View v = LayoutInflater.from(context).inflate(R.layout.rowlayout,parent,false);
       MyViewHolder VH = new MyViewHolder(v);
       return VH;
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        final MyItem myItemPosition = myList.get(position);
        int itemPosition = position;
        Glide.with(context).load(myItemPosition.getImageUrl()).into(holder.memeImageView);
        holder.downLoadBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context,HomeActivity.class);
                intent.putIntegerArrayListExtra("itemPosition",myItemPosition);
                context.startActivity(intent);
            }
        });
    }

    @Override
    public int getItemCount() {
        return myList.size();
    }
}

HomeActivity.Java this is my main activity code

public class HomeActivity extends AppCompatActivity {
    ImageView memeImage;
    private OutputStream outputStream;
    private File dir;
    private Intent intent;

    private final static int CODE = 100;

    ProgressBar progressBar;
    ShimmerFrameLayout shimmerFrameLayout;
    RecyclerView recyclerView;
    ImageButton downloadBtn, shareBtn;
    String url= "https://api.npoint.io/31a57e2cfcbddb1a1bb5";
    MyAdapter myAdapter;
    List<MyItem> listItems;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ActionBar actionbar =  getSupportActionBar();
        ColorDrawable colorDrawable = new ColorDrawable(Color.parseColor("#000000"));
        assert actionbar != null;
        actionbar.setBackgroundDrawable(colorDrawable);
        getSupportActionBar().setTitle("Dank Meme Factory");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        progressBar=findViewById(R.id.progressBarId);

        shareBtn=findViewById(R.id.shareBtnId);
        downloadBtn=findViewById(R.id.downloadBtnId);
        memeImage=findViewById(R.id.memeImageViewId);
        int location = getIntent().getExtras().getInt("itemPosition");

        recyclerView = findViewById(R.id.recyclerViewId);
        shimmerFrameLayout = findViewById(R.id.shimmer);
        shimmerFrameLayout.startShimmer();
        listItems = new ArrayList<>();
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        loadData();

        downloadBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ContextCompat.checkSelfPermission(HomeActivity.this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED){
                    download();

                }else {
                    askPermission();
                }
            }
        });

        shareBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                share();
            }
        });
    }

    //This method will share the image

    private void share() {
        StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
        StrictMode.setVmPolicy(builder.build());

        BitmapDrawable drawable = (BitmapDrawable) memeImage.getDrawable();
        Bitmap bitmap = drawable.getBitmap();

        File file = new File(getExternalCacheDir()+"/"+getResources().getString(R.string.app_name)+".jpg");

        try {
            outputStream = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.JPEG,100,outputStream);

            outputStream.flush();
            outputStream.close();

            intent = new Intent(Intent.ACTION_SEND);
            intent.setType("image/*");

            intent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(file));
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        startActivity(Intent.createChooser(intent,"Share image  "));
    }


    // This method is used to download Image

    private void download() {
        dir=new File(Environment.getExternalStorageDirectory(),"DownloadImage");
        if (!dir.exists()){
            dir.mkdir();
        }
        BitmapDrawable drawable = (BitmapDrawable) memeImage.getDrawable();
        Bitmap bitmap = drawable.getBitmap();

        File file = new File(dir, System.currentTimeMillis() + ".jpg");

        try {
            outputStream = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,outputStream);
        Toast.makeText(this, "Successfully Saved", Toast.LENGTH_SHORT).show();
        try {
            outputStream.flush();
            outputStream.close();

            Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            intent.setData(Uri.fromFile(file));
            sendBroadcast(intent);

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

        //this intent will help to save image to gallery

    }

    private void askPermission() {

        ActivityCompat.requestPermissions(HomeActivity.this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},CODE);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (CODE == requestCode){
            if (grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
                download();
            }else {
                Toast.makeText(HomeActivity.this,"Please Provide the Permission",Toast.LENGTH_SHORT).show();
            }
        }

        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    public void loadData (){
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {

                            JSONObject jsonObject = new JSONObject(response);
                            JSONArray array = jsonObject.getJSONArray("memes");

                            for (int i = 0; i < array.length(); i++) {

                                JSONObject receive = array.getJSONObject(i);

                                MyItem item = new MyItem(

                                        receive.getString("url")

                                );

                                listItems.add(item);

                            }
                            shimmerFrameLayout.stopShimmer();
                            shimmerFrameLayout.setVisibility(View.GONE);
                            recyclerView.setVisibility(View.VISIBLE);
                            myAdapter = new MyAdapter(listItems,getApplicationContext());
                            recyclerView.setAdapter(myAdapter);


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

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                    Toast.makeText(HomeActivity.this,"Server Error",Toast.LENGTH_SHORT).show();
            }
        });

        RequestQueue queue = Volley.newRequestQueue(this);
        queue.add(stringRequest);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuinflater = getMenuInflater();
        menuinflater.inflate(R.menu.toolbar_menu,menu);

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if (item.getItemId()==R.id.about_item){
            Toast.makeText(this,"You have selected about item",Toast.LENGTH_SHORT).show();
            return true;
        }else if (item.getItemId()==R.id.more_apps_item){
            Toast.makeText(this,"You have selected more apps item",Toast.LENGTH_SHORT).show();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

}

LogCat error

1.

2022-09-09 04:47:48.988 16392-16392/? E/dankmemefactor: Unknown bits set in runtime_flags: 0x40000000 2022-09-09 04:47:50.277
16392-16392/com.redge.dankmemefactory
E/OplusCustomizeRestrictionManager: sInstance is null, start a new
sInstance 2022-09-09 04:47:50.455
16392-16392/com.redge.dankmemefactory E/dankmemefactor: ofbOpen
failed with error=No such file or directory 2022-09-09 04:47:50.455 16392-16392/com.redge.dankmemefactory E/dankmemefactor: sysOpen
failed with error=No such file or directory 2022-09-09 04:47:51.605 16392-16489/com.redge.dankmemefactory E/OpenGLRenderer: Device claims wide gamut support, cannot find matching config, error = EGL_SUCCESS 2022-09-09 04:47:51.646 16392-16489/com.redge.dankmemefactory E/ion: ioctl c0044901 failed with code -1: Invalid argument 2022-09-09 04:47:51.703 16392-16489/com.redge.dankmemefactory E/OpenGLRenderer:
fbcNotifyFrameComplete error: undefined symbol:
fbcNotifyFrameComplete 2022-09-09 04:47:51.703
16392-16489/com.redge.dankmemefactory E/OpenGLRenderer:
fbcNotifyNoRender error: undefined symbol: fbcNotifyNoRender
2022-09-09 04:47:54.522 16392-16392/com.redge.dankmemefactory
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.redge.dankmemefactory, PID: 16392 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.redge.dankmemefactory/com.redge.dankmemefactory.HomeActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.Bundle.getInt(java.lang.String)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3815) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3977) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:109) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2374) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:233) at android.os.Looper.loop(Looper.java:344) at android.app.ActivityThread.main(ActivityThread.java:8248) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:589) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1071) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.Bundle.getInt(java.lang.String)' on a null object reference at com.redge.dankmemefactory.HomeActivity.onCreate(HomeActivity.java:97) at android.app.Activity.performCreate(Activity.java:8130) at android.app.Activity.performCreate(Activity.java:8110) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1343) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3781) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3977)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:109)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2374)  at android.os.Handler.dispatchMessage(Handler.java:106)  at android.os.Looper.loopOnce(Looper.java:233)  at android.os.Looper.loop(Looper.java:344)  at android.app.ActivityThread.main(ActivityThread.java:8248)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:589)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1071)

 

What am I doing wrong here?

0 Answers
Related