如何在安卓系统中显示保存在SD卡文件夹中的图片

13

我正在尝试显示保存在SD卡文件夹中的图像,我找到了以下链接。

从SD卡中以网格形式显示图像

我正在使用以下代码从指定的SD卡文件夹获取图像,但是这里我得到的计数为0。

MyCode.java

    String[] projection = {MediaStore.Images.Media._ID};
    
    final String[] columns = { MediaStore.Images.Media.DATA,MediaStore.Images.Media._ID };
    final String orderBy = MediaStore.Images.Media._ID;
    Cursor imagecursor = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            projection, 
            MediaStore.Images.Media.DATA + " like ? ",
            new String[] {"/my_images"},  
            null);
    int image_column_index = imagecursor.getColumnIndex(MediaStore.Images.Media._ID);
    this.count = imagecursor.getCount();
    this.thumbnails = new Bitmap[this.count];
    this.arrPath = new String[this.count];
    this.thumbnailsselection = new boolean[this.count];

    for (int i = 0; i < this.count; i++) {
        imagecursor.moveToPosition(i);
        int id = imagecursor.getInt(image_column_index);
        int dataColumnIndex = imagecursor
                .getColumnIndex(MediaStore.Images.Media.DATA);
        thumbnails[i] = MediaStore.Images.Thumbnails.getThumbnail(
                getApplicationContext().getContentResolver(), id,
                MediaStore.Images.Thumbnails.MICRO_KIND, null);
        arrPath[i] = imagecursor.getString(dataColumnIndex);
    }
    imageAdapter = new ImageAdapter();
    secure_gallery_grid.setAdapter(imageAdapter);
    imagecursor.close();

但是根据以下链接,所有保存在SD卡中的图像都会显示。但是我想显示保存在特定文件夹中的图像,就像我创建了“我的图片”文件夹并在其中保存了图像。我想从该文件夹中显示图像,并按照链接中的方式以网格视图显示。


我认为您应该缩小问题范围并更具体。 最好询问如何读取文件或如何显示文件,但首先进行搜索,我打赌您需要的所有内容都已经在那里了。 可以参考https://dev59.com/DWoy5IYBdhLWcg3wScPb - Sampo Sarrala - codidact.org
4个回答

34
您可以按如下方式从特定文件夹中获取文件路径。
获取文件路径后,您可以在网格视图中显示图像。
ArrayList<String> f = new ArrayList<String>();// list of file paths
File[] listFile;

public void getFromSdcard()
{
    File file= new File(android.os.Environment.getExternalStorageDirectory(),"TMyFolder");

        if (file.isDirectory())
        {
            listFile = file.listFiles();


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

                f.add(listFile[i].getAbsolutePath());

            }
        }
}

记得在清单文件里添加权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

具备写入权限默认拥有读取权限。

示例

main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent">

<GridView
    android:id="@+id/PhoneImageGrid"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:columnWidth="90dp"
    android:gravity="center"
    android:horizontalSpacing="10dp"
    android:numColumns="auto_fit"
    android:stretchMode="columnWidth"
    android:verticalSpacing="10dp" />

   </RelativeLayout>

gelleryitem.xml

   <?xml version="1.0" encoding="utf-8"?>
   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<ImageView android:id="@+id/thumbImage" android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:layout_centerInParent="true" />
<CheckBox android:id="@+id/itemCheckBox" android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:layout_alignParentRight="true"
    android:layout_alignParentTop="true" />
    </RelativeLayout>

AndroidCustomGalleryActivity.java

   public class AndroidCustomGalleryActivity extends Activity {
private int count;
private Bitmap[] thumbnails;
private boolean[] thumbnailsselection;
private String[] arrPath;
private ImageAdapter imageAdapter;
ArrayList<String> f = new ArrayList<String>();// list of file paths
File[] listFile;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    getFromSdcard();
    GridView imagegrid = (GridView) findViewById(R.id.PhoneImageGrid);
    imageAdapter = new ImageAdapter();
    imagegrid.setAdapter(imageAdapter);


}
public void getFromSdcard()
{
    File file= new File(android.os.Environment.getExternalStorageDirectory(),"MapleBear");

        if (file.isDirectory())
        {
            listFile = file.listFiles();


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

                f.add(listFile[i].getAbsolutePath());

            }
        }
}

public class ImageAdapter extends BaseAdapter {
    private LayoutInflater mInflater;

    public ImageAdapter() {
        mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        return f.size();
    }

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

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

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = mInflater.inflate(
                    R.layout.galleryitem, null);
            holder.imageview = (ImageView) convertView.findViewById(R.id.thumbImage);

            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }


        Bitmap myBitmap = BitmapFactory.decodeFile(f.get(position));
        holder.imageview.setImageBitmap(myBitmap);
        return convertView;
    }
}
class ViewHolder {
    ImageView imageview;


}
    }
快照。 enter image description here

通常情况下,您可以从文件夹中获取文件路径并显示图像。我上面发布的代码获取SD卡中一个文件夹下所有文件的路径。注意:该文件夹应只包含图像文件,否则您需要过滤文件路径。 - Raghunandan
@user2384424,你可以查看这个链接来过滤.png文件。http://stackoverflow.com/questions/15853611/how-can-i-add-sdcard-images-to-coverflow/15853710#15853710。你可以使用或运算符来匹配.jpg,字符串模式为“.png|.jpg”。根据你的需求修改上述内容。 - Raghunandan
有一个小问题。当我执行链接中的代码时,GridView对齐看起来很好,但如果我用你的代码替换它,对齐就不行了。你能帮我解决一下吗?图片如上所示... - user2384424
作为第一次使用stackoverflow的用户,我需要有10个声望才能发布图片...抱歉...我没有任何声望来发布图片。 - user2384424
我只复制了你的 XML 代码... - user2384424
显示剩余6条评论

1
使用通用图像加载器。

https://github.com/nostra13/Android-Universal-Image-Loader.git

将图像URL作为您的SD卡图像路径。
/**
     *adapter class for view pager
     *
     */
    private class ImagePagerAdapter extends PagerAdapter {
        LayoutInflater inflater;
        public ImagePagerAdapter() {
            inflater=getActivity().getLayoutInflater();
        }

        @Override
        public int getCount() {
            return viewPagerList.size();
        }
        @Override
        public void finishUpdate(View container) {
        }
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view.equals(object);
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View imageLayout = inflater.inflate(R.layout.item_pager_image, container, false);
            ImageView imageView = (ImageView) imageLayout.findViewById(R.id.image);
            final ProgressBar spinner = (ProgressBar) imageLayout.findViewById(R.id.loading);
            String loadURL=null;
            if(connectivityManager.hasDataConnectivity()){
                loadURL=viewPagerList.get(position).getModelImageUrl();
            }
            else {
                String fileName=viewPagerList.get(position).getModelImageUrl();
                fileName = fileName.replace(':', '/');
                fileName = fileName.replace('/', '_');
                loadURL="file://"+Environment.getExternalStorageDirectory()+"/"+folder+"/"+fileName;
            }
            BaseActivity.imageLoader.displayImage(loadURL, imageView, options, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingStarted(String imageUri, View view) {
                    spinner.setVisibility(View.VISIBLE);
                }

                @Override
                public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
                    String message = null;
                    switch (failReason) {
                    case IO_ERROR:
                        message = "Input/Output error";
                        break;
                    case OUT_OF_MEMORY:
                        message = "Out Of Memory error";
                        break;
                    case NETWORK_DENIED:
                        message = "Downloads are denied";
                        break;
                    case UNSUPPORTED_URI_SCHEME:
                        message = "Unsupported URI scheme";
                        break;
                    case UNKNOWN:
                        message = "Unknown error";
                        break;
                    }
                    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();

                    spinner.setVisibility(View.GONE);
                }

                @Override
                public void onLoadingComplete(final String imageUri, View view, final Bitmap loadedImage) {
                    spinner.setVisibility(View.GONE);
                    Logger.show(Log.INFO, "@@@@@@@", imageUri);
                    String uniqueUrlName = imageUri.replace(':', '/');
                    uniqueUrlName = uniqueUrlName.replace('/', '_');

                    File file = new File(Environment.getExternalStorageDirectory()
                            .toString()
                            + "/"
                            + folder
                            + "/"
                            + uniqueUrlName);
                    if(!file.exists()){
                        new Thread(new Runnable() {

                            public void run() {
                                String imageUrlString="file://"+GetModels.getModelURL(imageUri,folder,loadedImage,context);
                                Logger.show(Log.INFO, context.getClass().getName(), "image loaded my folfer"+ imageUrlString);
                            }
                        }).start();
                    }
                    Logger.show(Log.INFO, context.getClass().getName(), "image loaded loader "+ StorageUtils.getCacheDirectory(context));

                }  
            });

            imageView.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {

                    Bundle b=new Bundle();
                    b.putString("ProductName", viewPagerList.get(pos).getModelName());
                    b.putString("ProductPrice", viewPagerList.get(pos).getModelPrice());
                    b.putString("ProductUrl",viewPagerList.get(pos).getModelLink() );
                    String loadURL=null;
                    if(connectivityManager.hasDataConnectivity()){
                        loadURL=viewPagerList.get(pos).getModelImageUrl();
                    }
                    else {
                        String fileName=viewPagerList.get(pos).getModelImageUrl();
                        fileName = fileName.replace(':', '/');
                        fileName = fileName.replace('/', '_');
                        loadURL="file://"+Environment.getExternalStorageDirectory()+"/"
                                +folder+"/"+fileName;
                    }
                    b.putString("ProductImage", loadURL);
                    FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                    FragmentTransaction fragmentTransaction = fragmentManager
                            .beginTransaction();
                    fragmentTransaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left,R.anim.slide_in_left, R.anim.slide_out_right);
                    ProductOverview commentFragment = new ProductOverview();
                    commentFragment.setArguments(b);
                    fragmentTransaction.replace(R.id.product_container, commentFragment);
                    fragmentTransaction.addToBackStack(null);
                    fragmentTransaction.commit();

                }
            });
            ((ViewPager) container).addView(imageLayout, 0);
            return imageLayout;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            ((ViewPager) container).removeView((View) object);
        }
        @Override
        public void restoreState(Parcelable state, ClassLoader loader) {
        }

        @Override
        public Parcelable saveState() {
            return null;
        }

        @Override
        public void startUpdate(View container) {
        }
    }

你确定它能从SD卡加载图片吗?你试过了吗? - Chintan Rathod
是的,确定它正常工作。 - OMAK
你能在这里发布一些代码吗,这样我也可以使用它。因为我只尝试从互联网加载图像。我尝试从SD卡加载,但失败了。如果它能正常工作,那会帮助我很多。 - Chintan Rathod
会尝试这个...显然这是一个非常高效地处理图像内存的大型库。我曾经从互联网上下载过它,但它也可以从设备中的特定路径显示图像,这将解决我的内存溢出问题。 :) - Chintan Rathod
1
@ChintanRathod 你可以从SD卡中显示图片。获取文件路径。将其存储在ArrayList中。将ArrayList传递给适配器类的构造函数。在getView方法中,imageLoader.displayImage(data.get(position).toString(), image, options); //这里的data是ArrayList,image是ImageView,options是UIL的显示选项。 - Raghunandan

1
无法使用MediaStore方法显示特定文件夹中的图像。因为存储在MediaStore中的每个图像都有不同的唯一标识符来识别它。
但是,您可以通过创建自己的方法来识别特定文件夹中的图像,然后获取创建缩略图图像。

你有任何示例或大致的草图吗?我正在尝试在这里实现它 链接,你能帮忙吗! - Umair

-1

这里我发布了一段代码,用于从“特定目录”检索文件名。您需要自己完成其他任务。

File imgDir = new File(Environment.getExternalStorageDirectory()+ File.separator + "directory");

if (!imgDir.exists())
    imgDir.mkdir();

String files[] = imgDir.list();

现在检查一下"files[]"是否为空。
if (files == null)
    // no files
else{
    count = files.length;
    //do something
}

您有一个文件列表和它们的路径,请从中提取出位图并在网格中显示。
注意:
要打印完整路径,请使用以下代码。
imgDir.getAbsolutePath() + File.separator + files[i]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接