How can I display images from a specific folder on android gallery
Asked Answered
R

6

9

How can I display all images from a specific folder on android gallery like, for example, whatapp does. I`m using MediaScannerConnectionClient

File folder = new File("/sdcard/myfolder/");
allFiles = folder.list();
SCAN_PATH=Environment.getExternalStorageDirectory().toString()+"/myfolder/"+allFiles[0];
@Override
public void onScanCompleted(String path, Uri uri) {
    try {
        if (uri != null) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(uri);
            startActivity(intent);

        }
    } finally {
        conn.disconnect();
        conn = null;
    }
}

private void startScan() {
    if (conn != null) {
        conn.disconnect();
    }
    conn = new MediaScannerConnection(this, this);
    conn.connect();
}
    @Override
public void onMediaScannerConnected() {
    conn.scanFile(SCAN_PATH, "image/*");
}

But I`m getting a error at this point:

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(uri);
    startActivity(intent);

Specific here:

startActivity(intent);

Fail to get type for: content://media/external/images/media/267830 No Activity found to handle Intent

On onScanCompleted my path and uri parameters are not null.

Rod answered 16/11, 2012 at 14:42 Comment(4)
wen u give a static path u dont need to call the gallery which your are trying using the intentBerners
are you saying that I dont need the code inside onScanCompleted ?Rod
:yes..the action view won't give u the static path which u intent to do.Berners
This Tutorial Can Help youZymometer
P
13

Hi you can use the code below, i hope it helps you .

package com.example.browsepicture;

import java.io.File;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.media.MediaScannerConnection;
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class BrowsePicture2 extends Activity {
    String SCAN_PATH;
    File[] allFiles ;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_browse_picture);

        File folder = new File(Environment.getExternalStorageDirectory().getPath()+"/aaaa/");
        allFiles = folder.listFiles();

        ((Button) findViewById(R.id.button1))
                .setOnClickListener(new OnClickListener() {
                    public void onClick(View arg0) {
                        new SingleMediaScanner(BrowsePicture2.this, allFiles[0]);
                    }
                });
    }

    public class SingleMediaScanner implements MediaScannerConnectionClient {

        private MediaScannerConnection mMs;
        private File mFile;

        public SingleMediaScanner(Context context, File f) {
            mFile = f;
            mMs = new MediaScannerConnection(context, this);
            mMs.connect();
        }

        public void onMediaScannerConnected() {
            mMs.scanFile(mFile.getAbsolutePath(), null);
        }

        public void onScanCompleted(String path, Uri uri) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(uri);
            startActivity(intent);
            mMs.disconnect();
        }

    }
}
Perique answered 16/11, 2012 at 14:56 Comment(4)
talhakosen, i think that this example is a little different. is there a way instead of I develop my own viewer, I use android native gallery to show my image folder ?Rod
but won't public void onScanCompleted(String path, Uri uri) open a specific file? which is allFiles[0] ?Zacynthus
yes @EladBenda, it just opens a specific file. but it opens it in gallery so user can swipe through images. it's not ideal, i agree. i'm working on an in-app gallery library based on AOSP. there seems to be none around that i know of.Helprin
folder.listFiles(); returns null. I have 2 images in that folder. Any help?Fee
S
3

You should add Grid view Adapter class.

public class GalleryPictureActivity extends Activity
{
    private String[]        FilePathStrings;
    private File[]          listFile;
    GridView                grid;
    GridViewAdapter         adapter;
    File                    file;
    public static Bitmap    bmp = null;
    ImageView               imageview;

    @Override
    protected void onCreate (Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gallery_picture);
        // Check for SD Card
        if (!Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED))
        {
            Toast.makeText(this, "Error! No SDCARD Found!",
                    Toast.LENGTH_LONG).show();
        }
        else
        {
            // Locate the image folder in your SD Card
            file = new File(Environment.getExternalStorageDirectory()
                    .getPath() + "/images");
        }
        if (file.isDirectory())
        {
            listFile = file.listFiles();
            FilePathStrings = new String[listFile.length];
            for (int i = 0; i < listFile.length; i++)
            {
                FilePathStrings[i] = listFile[i].getAbsolutePath();
            }
        }
        grid = (GridView)findViewById(R.id.gridview);
        adapter = new GridViewAdapter(this, FilePathStrings);
        grid.setAdapter(adapter);

        grid.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick (AdapterView<?> parent, View view,
                    int position, long id)
            {
                imageview = (ImageView)findViewById(R.id.imageView1);
                int targetWidth = 700;
                int targetHeight = 500;
                BitmapFactory.Options bmpOptions = new BitmapFactory.Options();
                bmpOptions.inJustDecodeBounds = true;
                BitmapFactory.decodeFile(FilePathStrings[position],
                        bmpOptions);
                int currHeight = bmpOptions.outHeight;
                int currWidth = bmpOptions.outWidth;
                int sampleSize = 1;
                if (currHeight > targetHeight || currWidth > targetWidth)
                {
                    if (currWidth > currHeight)
                        sampleSize = Math.round((float)currHeight
                                / (float)targetHeight);
                    else
                        sampleSize = Math.round((float)currWidth
                                / (float)targetWidth);
                }
                bmpOptions.inSampleSize = sampleSize;
                bmpOptions.inJustDecodeBounds = false;
                bmp = BitmapFactory.decodeFile(FilePathStrings[position],
                        bmpOptions);
                imageview.setImageBitmap(bmp);
                imageview.setScaleType(ImageView.ScaleType.FIT_XY);
                bmp = null;

            }
        });

    }
}

Another Class GridView Adapter :

   public class GridViewAdapter extends BaseAdapter
{
    private Activity                activity;
    private String[]                filepath;
    private static LayoutInflater   inflater    = null;
    Bitmap                          bmp         = null;

    public GridViewAdapter (Activity a, String[] fpath)
    {
        activity = a;
        filepath = fpath;
        inflater = (LayoutInflater)activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount ()
    {
        return filepath.length;
    }

    public Object getItem (int position)
    {
        return position;
    }

    public long getItemId (int position)
    {
        return position;
    }

    public View getView (int position, View convertView, ViewGroup parent)
    {
        View vi = convertView;
        if (convertView == null)
            vi = inflater.inflate(R.layout.gridview_item, null);
        ImageView image = (ImageView)vi.findViewById(R.id.image);
        int targetWidth = 100;
        int targetHeight = 100;
        BitmapFactory.Options bmpOptions = new BitmapFactory.Options();
        bmpOptions.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(filepath[position], bmpOptions);
        int currHeight = bmpOptions.outHeight;
        int currWidth = bmpOptions.outWidth;
        int sampleSize = 1;
        if (currHeight > targetHeight || currWidth > targetWidth)
        {
            if (currWidth > currHeight)
                sampleSize = Math.round((float)currHeight
                        / (float)targetHeight);
            else
                sampleSize = Math.round((float)currWidth
                        / (float)targetWidth);
        }
        bmpOptions.inSampleSize = sampleSize;
        bmpOptions.inJustDecodeBounds = false;
        bmp = BitmapFactory.decodeFile(filepath[position], bmpOptions);
        image.setImageBitmap(bmp);
        image.setScaleType(ImageView.ScaleType.FIT_XY);
        bmp = null;
        return vi;
    }
}

Activity:

activity_gallery_picture:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/LinearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center" >

    <GridView
            android:id="@+id/gridview"
            android:layout_width="fill_parent"
            android:layout_height="match_parent" 
            android:layout_weight=".85">

   </GridView>

   <ImageView
           android:id="@+id/imageView1"
           android:layout_width="fill_parent"
           android:layout_height="fill_parent"
           android:layout_weight=".25"
           android:scaleType="fitXY"
           android:src="@drawable/galleryimage" />

  </LinearLayout>

Another activity Layout :

 <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" >
     <ImageView
             android:id="@+id/image"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content" />
 </RelativeLayout>
Scowl answered 16/10, 2014 at 11:55 Comment(1)
Mediascanner will display Deleted images while you scanScowl
T
0

Answer given by @Talha works good but it tries to open image using image app options. If you want to just refresh gallery with folder in sd card you can modify code as below for SingleMediaScanner

class SingleMediaScanner implements MediaScannerConnectionClient {

    private MediaScannerConnection mMs;
    private File mFile;

    public SingleMediaScanner(Context context, File f) {
        mFile = f;
        mMs = new MediaScannerConnection(context, this);
        mMs.connect();
    }

    public void onMediaScannerConnected() {
        mMs.scanFile(mFile.getAbsolutePath(), null);
    }

    public void onScanCompleted(String path, Uri uri) {

        mMs.disconnect();
    }

}

And in button click loop over each file you get from:

    File folder = new File(Environment.getExternalStorageDirectory().getPath()+"/aaaa/");
    allFiles = folder.listFiles();

And pass that to SingleMediaScanner one at time.

It worked in my case.

Tampa answered 15/7, 2014 at 6:4 Comment(0)
V
0

You can use android.database.Cursor

public boolean OpenGalleryFromFolder(android.content.Context context, String folderName)
{
    String filePath = android.os.Environment.getExternalStorageDirectory().getPath() + "/Pictures/" + folderName + "/";
    return OpenGalleryFromPathToFolder(context, filePath);
}

// Finds the first image in the specified folder and uses it to open a the devices native gallery app with all images in that folder.
public boolean OpenGalleryFromPathToFolder(android.content.Context context, String folderPath)
{
    java.io.File folder = new java.io.File(folderPath);
    java.io.File[] allFiles = folder.listFiles();

    if (allFiles != null && allFiles.length > 0)
    {
        android.net.Uri imageInFolder = getImageContentUri(context, allFiles[0]);
        if (imageInFolder != null)
        {
            android.content.Intent intent = new android.content.Intent(android.content.Intent.ACTION_VIEW);
            intent.setData(imageInFolder);
            context.startActivity(intent);
            return true;
        }
    }
    return false;
}

// converts the absolute path of a file to a content path
// absolute path example: /storage/emulated/0/Pictures/folderName/Image1.jpg
// content path example: content://media/external/images/media/47560
private android.net.Uri getImageContentUri(android.content.Context context, java.io.File imageFile) {
    String filePath = imageFile.getAbsolutePath();
    android.database.Cursor cursor = context.getContentResolver().query(
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            new String[]{android.provider.MediaStore.Images.Media._ID},
            android.provider.MediaStore.Images.Media.DATA + "=? ",
            new String[]{filePath}, null);
    if (cursor != null && cursor.moveToFirst()) {
        int id = cursor.getInt(cursor.getColumnIndex(android.provider.MediaStore.MediaColumns._ID));
        return android.net.Uri.withAppendedPath(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + id);
    } else {
        if (imageFile.exists()) {
            android.content.ContentValues values = new android.content.ContentValues();
            values.put(android.provider.MediaStore.Images.Media.DATA, filePath);
            return context.getContentResolver().insert(
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        } else {
            return null;
        }
    }
}
Violoncellist answered 11/6, 2015 at 22:6 Comment(0)
U
0

You can fetch image from specific folder on SDcard using my ways also delete the files.

MainActivity

    FileAdapter fileAdapter;
    RecyclerView recyclerView;
    ArrayList<String> filePath = new ArrayList<>();
    ArrayList<String> filename = new ArrayList<>();
    private File[] listFile;
    File file;


    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    tv_empty =  findViewById(R.id.tv_empty);

    loadFiles();
    fileAdapter = new FileAdapter(this, filePath, filename);

    recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
    recyclerView.setAdapter(fileAdapter);
    fileAdapter.notifyDataSetChanged();


    private void loadFiles() {
        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            Toast.makeText(getActivity(), "Error! No SDCARD Found!", Toast.LENGTH_LONG).show();
        } else {
            file = new File(Environment.getExternalStorageDirectory().getPath() + "/StorySaver");
            if (!file.exists()) {
                file.mkdirs();
            }
        }

        filePath.clear();
        filename.clear();
        if (file.isDirectory()) {
            listFile = file.listFiles();
            for (File absolutePath : listFile) {
                filePath.add(absolutePath.getAbsolutePath());
                filename.add(absolutePath.getName());
            }
        }

        if (filePath.size() == 0) {
            tv_empty.setVisibility(View.VISIBLE);
        } else {
            tv_empty.setVisibility(View.GONE);
        }
    }

MyAdapter

public class FileAdapter extends RecyclerView.Adapter<FileAdapter.CustomViewHolder> {
        ArrayList<String> filepath;
        ArrayList<String> filename;
        public Context mContext;
        File file;

        public class CustomViewHolder extends RecyclerView.ViewHolder {
            TextView content;
            ImageView imageView;

            public CustomViewHolder(final View view) {
                super(view);
                this.content = (TextView) view.findViewById(R.id.content);
                this.imageView = (ImageView) view.findViewById(R.id.image);
            }
        }

        public FileAdapter(Context context, ArrayList<String> filepath, ArrayList<String> filename) {
            this.filepath = filepath;
            this.filename = filename;
            this.mContext = context;
        }


        public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            return new CustomViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_file, null));
        }

        public void onBindViewHolder(CustomViewHolder customViewHolder, final int i) {
            file = new File(filepath.get(i));
            customViewHolder.content.setText(filename.get(i));
            Glide.with(this.mContext).load(filepath.get(i)).into(customViewHolder.imageView);
            customViewHolder.imageView.setOnLongClickListener(new OnLongClickListener() {
                public boolean onLongClick(View view) {
                    Builder builder = new Builder(mContext);
                    builder.setMessage("Are you sure you want delete this?");
                    builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialogInterface, int v) {
                            if (file.exists()) {
                                file.delete();
                            }
                            filepath.remove(i);
                            notifyDataSetChanged();
                        }
                    });
                    builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialogInterface, int i) {
                            dialogInterface.cancel();
                        }
                    });
                    builder.show();
                    return false;
                }
            });

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

                    Intent intent = new Intent();
                    intent.setAction(android.content.Intent.ACTION_VIEW);
                    Uri data = FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID + ".provider", new File(filepath.get(i)));
                    intent.setDataAndType(data, "*/*");
                    try {
                        String substring = filename.get(i).substring(filename.get(i).lastIndexOf("."));

                        if (substring.equals(".jpg")) {
                            intent.setDataAndType(data, "image/*");
                        } else if (substring.equals(".mp4")) {
                            intent.setDataAndType(data, "video/*");
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    try {
                        mContext.startActivity(intent);
                    } catch (ActivityNotFoundException unused) {
                        Toast.makeText(mContext, "No application available", Toast.LENGTH_SHORT).show();
                    }
                }
            });

        }

        public int getItemCount() {
            return filepath.size();
        }
    }
Urtication answered 27/5, 2020 at 10:29 Comment(0)
D
0

100% work

Kotlin Fragment

class MyPhotosFragment : Fragment() {
private var _binding : FragmentMyPhotosBinding? = null
val binding get() = _binding!!
private lateinit var myPhotoAdapter : MyPhotoAdapter
var file: File? = null
var filePath: ArrayList<String> = ArrayList()
var filename: ArrayList<String> = ArrayList()
private var listFile: Array<File>? = null
@SuppressLint("NotifyDataSetChanged")
override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = FragmentMyPhotosBinding.inflate(layoutInflater)
    loadSpecificFile()
    myPhotoAdapter = MyPhotoAdapter(requireContext(), filePath, filename)
    binding.savedPhotoRecyclerView.layoutManager = GridLayoutManager(requireContext(),3)
    binding.savedPhotoRecyclerView.adapter = myPhotoAdapter
    myPhotoAdapter.notifyDataSetChanged()
    return binding.root
}

private fun loadSpecificFile() {
    if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
        Toast.makeText(requireContext(), "Error! No SDCARD Found!", Toast.LENGTH_LONG).show()
    } else {

        file = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).path + "/PhotoEditor/")
        if (!file!!.exists()){
            file!!.mkdirs()
        }
        else{
                listFile = file!!.listFiles { _, name ->
                    name.endsWith(".jpg") || name.endsWith(".jpeg") || name.endsWith(
                        ".png")
                }
                for (absolutePath in listFile!!) {
                    filePath.add(absolutePath.absolutePath)
                    filename.add(absolutePath.name)
                }
        }
    }
}

}

Kotlin Adapter

class MyPhotoAdapter(var context : Context, private var myPhotosPathList: ArrayList<String>, private var myPhotosNameList: ArrayList<String>) : RecyclerView.Adapter<MyPhotoAdapter.ViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val view = LayoutInflater.from(parent.context)
        .inflate(R.layout.saved_photo_layout, parent, false)

    return ViewHolder(
        view
    )
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    var file = File(myPhotosPathList[position]);
    Glide.with(context).load(file)
        .into(holder.savedPhoto)
    holder.savedPhoto.setOnLongClickListener {
        val builder = AlertDialog.Builder(context)
        builder.setMessage("Are you sure you want delete this?")
        builder.setPositiveButton("YES"
        ) { _, _ ->
            if (file.exists()) {
                file.delete()
            }
            myPhotosPathList.removeAt(position)
            notifyDataSetChanged()
        }
        builder.setNegativeButton("NO"
        ) { dialogInterface, i -> dialogInterface.cancel() }
        builder.show()
        false
    }
    holder.savedPhoto.setOnClickListener {
        val intent = Intent()
        intent.action = Intent.ACTION_VIEW
        val data: Uri = FileProvider.getUriForFile(
            context,
            BuildConfig.APPLICATION_ID + ".provider",
            File(myPhotosPathList[position])
        )
        intent.setDataAndType(data, "*/*")
        try {
            val substring: String =
                myPhotosNameList[position].substring(myPhotosNameList[position].lastIndexOf("."))
            if (substring == ".jpg" || substring == ".jpeg" || substring == ".png") {
                intent.setDataAndType(data, "image/*")
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        try {
            context.startActivity(intent)
        } catch (unused: ActivityNotFoundException) {
            Toast.makeText(context, "No application available", Toast.LENGTH_SHORT).show()
        }
    }
}

override fun getItemCount(): Int {
    return myPhotosPathList.size
}

class ViewHolder(ItemView: View) : RecyclerView.ViewHolder(ItemView) {
    val savedPhoto : ImageView = itemView.findViewById(R.id.savedPhoto)

}

} Output

Devilry answered 13/6, 2022 at 11:26 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.