How to show dialog to set image as wallpaper or profile picture in android?

1.7k Views Asked by At

I have a pic inside my app in raw folder. I want to give option to users to set that image as an wallpaper or profile picture. A dialog should popup when the option is selected. Like this: enter image description here

I tried showing this dialog with the following code

int resId = R.raw.a_day_without_thinking_mobile;

        Resources resources = this.getResources();
       Uri sendUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + resources.getResourcePackageName(resId) + '/' + resources.getResourceTypeName(resId) + '/' + resources.getResourceEntryName(resId));

        Intent intent = new Intent(Intent.ACTION_ATTACH_DATA);
        intent.setDataAndType(sendUri, "image/jpg");
        intent.putExtra("mimeType", "image/jpg");
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

        startActivity(Intent.createChooser(intent, "Set As"));

But this showed me a dialog like this:

enter image description here

I don't want to set image directly as wallpaper instead a dialog should be shown from where user can select whether he/she wants to use the image as wallpaper or profile picture.

2

There are 2 best solutions below

0
Kripesh  Adwani On BEST ANSWER

First you must download image file from raw folder to sd card and then use the sd card file to set the image as wallpaper

 int resId = R.raw.a_day_without_thinking_mobile;

String filename = getResources().getResourceEntryName(resId );

                String destfolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath() + "/Motivational Quotes";
                createDirIfNotExists(destfolder);

                String destinationPath = destfolder +"/"+ filename + ".jpg";
                File destination = new File(destinationPath);

                InputStream ins = getResources().openRawResource(
                        getResources().getIdentifier(filename,
                                "raw", getPackageName()));





                try {
                    copy2(ins,destination);
                    //Toast.makeText(this, "Image Downloaded", Toast.LENGTH_SHORT).show();

                    File externalFile=new File(destinationPath);
                    Uri sendUri2 = Uri.fromFile(externalFile);
                    Log.d("URI:", sendUri2.toString());

                    Intent intent = new Intent(Intent.ACTION_ATTACH_DATA);
                    intent.setDataAndType(sendUri2, "image/jpg");
                    intent.putExtra("mimeType", "image/jpg");
                    startActivityForResult(Intent.createChooser(intent, "Set As"), 200);

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

 public void copy2(InputStream src, File dst) throws IOException {
        InputStream in = src;

        OutputStream out = new FileOutputStream(dst);
        //InputStream in = new FileInputStream(src);

        // Transfer bytes from in to out
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
        addImageGallery(dst);
    }

    private void addImageGallery( File file ) {
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); // setar isso
        values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
        getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    }

    public static boolean createDirIfNotExists(String path) {
        boolean ret = true;

        File file = new File(path);
        if (!file.exists()) {
            if (!file.mkdirs()) {
                Log.e("TravellerLog :: ", "Problem creating Image folder");
                ret = false;
            }
        }
        return ret;
    }

Here is the code that you can use

1
Niza Siwale On

Remove the put extra from your intent and use the following for data and type

intent.setDataAndType(sendUri, "image/*");