How can I display images from a specific folder in the Android gallery

How can I display all images from a specific folder in the Android gallery, for example, whatapp. I am 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 get an error message:

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

Specifically here:

 startActivity(intent); 

Unable to get type for: content: // media / external / images / media / 267830 The action was not found for processing Intent

In onScanCompleted, the parameters of my path and uri are not null.

+5
source share
4 answers

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(); } } } 
+11
source

You must add the 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 GridView class 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 type of activity:

  <?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> 
+1
source

The answer given by @Talha works well, but it tries to open the image using the graphics application settings. If you just want to update the gallery using the folder on the SD card, you can change the code as shown 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 the button, click the loop over each file from which you get:

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

And pass this SingleMediaScanner one at a time.

This worked in my case.

0
source

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; } } } 
0
source

Source: https://habr.com/ru/post/916627/


All Articles