将图库中的所有图像加载到 android 中的应用程序中 [英] Loading all the images from gallery into the Application in android

查看:27
本文介绍了将图库中的所有图像加载到 android 中的应用程序中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个应用程序,其中我需要将图库中的所有图像放入其中具有 girdview 的应用程序中.我希望所有文件夹中的所有图像都出现在 gridview 中.

String[] proj = { MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID };实际图像光标 = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, proj,null, null, MediaStore.Images.Media.DEFAULT_SORT_ORDER);actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);actualimagecursor.moveToPosition(position);String i = actualimagecursor.getString(actual_image_column_index);

我已将此代码添加到我的代码中,但我只获得了 sd 卡图像,没有获得其他文件夹图像.如何从图库中获取所有图像?

提前致谢.

解决方案

Glide 的帮助下工作的解决方案.奖励部分是 Glide 会自动播放 Gif.

import java.util.ArrayList;导入 android.app.Activity;导入 android.database.Cursor;导入android.net.Uri;导入 android.os.Bundle;导入 android.provider.MediaStore;导入 android.provider.MediaStore.MediaColumns;导入 android.view.View;导入 android.view.ViewGroup;导入 android.widget.AdapterView;导入 android.widget.AdapterView.OnItemClickListener;导入 android.widget.BaseAdapter;导入 android.widget.GridView;导入 android.widget.ImageView;导入 android.widget.Toast;进口 com.bumptech.glide.Glide;/*** 类 GallarySample.*/公共类 GallarySample 扩展活动 {/** 图片.*/私有 ArrayList图片;@覆盖public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.gallery_activity);GridView 画廊 = (GridView) findViewById(R.id.galleryGridView);Gallery.setAdapter(new ImageAdapter(this));Gallery.setOnItemClickListener(new OnItemClickListener() {@覆盖public void onItemClick(AdapterView<?> arg0, View arg1,int 位置,长 arg3) {if (null != images && !images.isEmpty())Toast.makeText(getApplicationContext(),位置"+位置+"+images.get(位置),300).show();;}});}/*** 类 ImageAdapter.*/私有类 ImageAdapter 扩展 BaseAdapter {/** 上下文.*/私人活动上下文;/*** 实例化一个新的图像适配器.** @param localContext* 当地情况*/公共图像适配器(活动本地上下文){上下文 = 本地上下文;图像 = getAllShownImagesPath(context);}公共 int getCount() {返回图像大小();}公共对象 getItem(int position) {返回位置;}public long getItemId(int position) {返回位置;}public View getView(final int position, View convertView,视图组父级) {ImageView 图片查看;if (convertView == null) {图片视图 = 新图像视图(上下文);图片视图.setScaleType(ImageView.ScaleType.FIT_CENTER);图片查看.setLayoutParams(new GridView.LayoutParams(270, 270));} 别的 {图片视图 = (ImageView) convertView;}Glide.with(context).load(images.get(position)).placeholder(R.drawable.ic_launcher).centerCrop().into(picturesView);返回图片查看;}/*** 获取所有图像路径.** @param 活动*            活动* @return ArrayList 与图像路径*/私有 ArrayListgetAllShownImagesPath(活动活动){乌里乌里;光标光标;int column_index_data, column_index_folder_name;ArrayListlistOfAllImages = new ArrayList();String absolutePathOfImage = null;uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;String[] 投影 = { MediaColumns.DATA,MediaStore.Images.Media.BUCKET_DISPLAY_NAME };cursor = activity.getContentResolver().query(uri,projection,null,空,空);column_index_data = cursor.getColumnIndexOrThrow(MediaColumns.DATA);column_index_folder_name = 游标.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME);而 (cursor.moveToNext()) {absolutePathOfImage = cursor.getString(column_index_data);listOfAllImages.add(absolutePathOfImage);}返回 listOfAllImages;}}}

gridView 的布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><网格视图android:id="@+id/galleryGridView"android:layout_width="match_parent"android:layout_height="wrap_content"android:columnWidth="280dp"机器人:重力=中心"机器人:水平间距=2dp"机器人:numColumns =2"机器人:填充=2dp"android:stretchMode="columnWidth"android:verticalSpacing="2dp" ></GridView></RelativeLayout>

使用 KotlinLoderManager 更新 2019:

** 2) 使用 LoderManager 加载异步加载图像.**

在您的 Activity 或 Fragment 类中实现 LoaderManager.LoaderCallbacks

覆盖 LoaderCallbacks:

private val IMAGE_LOADER_ID = 1私有 val listOfAllImages = ArrayList()override fun onCreateLoader(p0: Int, p1: Bundle?): Loader{val uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URIval 投影 = arrayOf(MediaColumns.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME)val 选择:字符串?= null//选择条件val selectionArgs = arrayOf()//选择标准val sortOrder:字符串?= 空返回 CursorLoader(活动!!.applicationContext,尿,投影,选择,选择参数,排序)}覆盖 fun onLoadFinished(loader: Loader, cursor: Cursor?) {光标?.let {val columnIndexData = it.getColumnIndexOrThrow(MediaColumns.DATA);而 (it.moveToNext()) {listOfAllImages.add(it.getString(columnIndexData));}}}覆盖乐趣 onLoaderReset(loader: Loader) {}

最后关于 onCreate 方法初始化加载器:

 loaderManager.initLoader(IMAGE_LOADER_ID,空值,这个)

3) 使用 Kotlin 协程 &ViewModel

<块引用>

实现'androidx.core:core-ktx:1.0.2'

实现'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0-M2'

实现org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0-M2"

使用Coroutine上下文

创建视图模型

/*** 使用协程加载图片*/类 ImageViewModel : ViewModel(), CoroutineScope {私人 val 作业 = Job()覆盖 val coroutineContext: CoroutineContextget() = 作业 + Dispatchers.Mainprivate var imagesLiveData: MutableLiveData>= MutableLiveData()fun getImageList(): MutableLiveData>{返回图像LiveData}/*** 获取所有图像路径.** 所需的存储权限** @return ArrayList 与图像路径*/内部乐趣 loadImagesfromSDCard(): ArrayList{val uri: uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URIval游标:游标?val column_index_data: Intval column_index_folder_name: Intval listOfAllImages = ArrayList()var absolutePathOfImage:字符串?= 空val 投影 = arrayOf(MediaStore.MediaColumns.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME)cursor = AppController.globalContentResolvere!!.query(uri,projection,null,null,null)column_index_data = cursor!!.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA)column_index_folder_name = 游标!!.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME)而(光标!!.moveToNext()){absolutePathOfImage = cursor!!.getString(column_index_data)listOfAllImages.add(absolutePathOfImage)}返回 listOfAllImages}有趣的 getAllImages() {启动(Dispatchers.Main){imagesLiveData.value = withContext(Dispatchers.IO) {loadImagesfromSDCard()}}}}

然后使用viewModel

 val imageViewModel = ViewModelProviders.of(this).get(ImageViewModel::class.java)imageViewModel.getImageList().observe(this, Observer> { listOfImage ->imageWidgetStatus.text = """找到 ${listOfImage.size} 个图像"""//加载图片imageViewModel.getAllImages()

I am creating an application wherein I need all the images in the gallery into my application that has a girdview in it. I want all the images from all the folders to appear in the gridview.

String[] proj = { MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID };
actualimagecursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, proj,
                      null, null, MediaStore.Images.Media.DEFAULT_SORT_ORDER);

actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
actualimagecursor.moveToPosition(position);
String i = actualimagecursor.getString(actual_image_column_index);

I have added this code into my code but i get only the sd card images no other folder images are obtained. How can i get all the images from the gallery?

Thanks in advance.

解决方案

Working solution with the help of Glide. Bonus part is Glide will auto play Gif .

import java.util.ArrayList;

import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.MediaStore.MediaColumns;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast;

import com.bumptech.glide.Glide;

/**
 * The Class GallarySample.
 */
public class GallarySample extends Activity {

    /** The images. */
    private ArrayList<String> images;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gallery_activity);

        GridView gallery = (GridView) findViewById(R.id.galleryGridView);

        gallery.setAdapter(new ImageAdapter(this));

        gallery.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1,
                    int position, long arg3) {
                if (null != images && !images.isEmpty())
                    Toast.makeText(
                            getApplicationContext(),
                            "position " + position + " " + images.get(position),
                            300).show();
                ;

            }
        });

    }

    /**
     * The Class ImageAdapter.
     */
    private class ImageAdapter extends BaseAdapter {

        /** The context. */
        private Activity context;

        /**
         * Instantiates a new image adapter.
         *
         * @param localContext
         *            the local context
         */
        public ImageAdapter(Activity localContext) {
            context = localContext;
            images = getAllShownImagesPath(context);
        }

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

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

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

        public View getView(final int position, View convertView,
                ViewGroup parent) {
            ImageView picturesView;
            if (convertView == null) {
                picturesView = new ImageView(context);
                picturesView.setScaleType(ImageView.ScaleType.FIT_CENTER);
                picturesView
                        .setLayoutParams(new GridView.LayoutParams(270, 270));

            } else {
                picturesView = (ImageView) convertView;
            }

            Glide.with(context).load(images.get(position))
                    .placeholder(R.drawable.ic_launcher).centerCrop()
                    .into(picturesView);

            return picturesView;
        }

        /**
         * Getting All Images Path.
         *
         * @param activity
         *            the activity
         * @return ArrayList with images Path
         */
        private ArrayList<String> getAllShownImagesPath(Activity activity) {
            Uri uri;
            Cursor cursor;
            int column_index_data, column_index_folder_name;
            ArrayList<String> listOfAllImages = new ArrayList<String>();
            String absolutePathOfImage = null;
            uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

            String[] projection = { MediaColumns.DATA,
                    MediaStore.Images.Media.BUCKET_DISPLAY_NAME };

            cursor = activity.getContentResolver().query(uri, projection, null,
                    null, null);

            column_index_data = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
            column_index_folder_name = cursor
                    .getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME);
            while (cursor.moveToNext()) {
                absolutePathOfImage = cursor.getString(column_index_data);

                listOfAllImages.add(absolutePathOfImage);
            }
            return listOfAllImages;
        }
    }
}

Layout file for gridView

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <GridView
        android:id="@+id/galleryGridView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:columnWidth="280dp"
        android:gravity="center"
        android:horizontalSpacing="2dp"
        android:numColumns="2"
        android:padding="2dp"
        android:stretchMode="columnWidth"
        android:verticalSpacing="2dp" >
    </GridView>

</RelativeLayout>

UPDATE 2019 with Kotlin and LoderManager:

** 2) Use LoderManager to load async load images.**

Implement LoaderManager.LoaderCallbacks<Cursor> in your activity or Fragment class

Override LoaderCallbacks this:

private val IMAGE_LOADER_ID = 1
private val listOfAllImages = ArrayList<String>()



override fun onCreateLoader(p0: Int, p1: Bundle?): Loader<Cursor> {

    val uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
    val projection = arrayOf(MediaColumns.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME)
    val selection: String? = null     //Selection criteria
    val selectionArgs = arrayOf<String>()  //Selection criteria
    val sortOrder: String? = null

    return CursorLoader(
            activity!!.applicationContext,
            uri,
            projection,
            selection,
            selectionArgs,
            sortOrder)
}

override fun onLoadFinished(loader: Loader<Cursor>, cursor: Cursor?) {

    cursor?.let {
        val columnIndexData = it.getColumnIndexOrThrow(MediaColumns.DATA);

        while (it.moveToNext()) {

            listOfAllImages.add(it.getString(columnIndexData));
        }
    }
}


override fun onLoaderReset(loader: Loader<Cursor>) {
}

Lastly on onCreate method init loader:

 loaderManager.initLoader(IMAGE_LOADER_ID,
                null,
                this)

3) Using Kotlin Coroutine & ViewModel

implementation 'androidx.core:core-ktx:1.0.2'

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0-M2'

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0-M2"

Create View Model With Coroutine Context

  /**
   * Use Coroutines To Load Images
   */
   class ImageViewModel : ViewModel(), CoroutineScope {

    private val job = Job()
    override val coroutineContext: CoroutineContext
        get() = job + Dispatchers.Main

    private var imagesLiveData: MutableLiveData<List<String>> = MutableLiveData()
    fun getImageList(): MutableLiveData<List<String>> {
        return imagesLiveData
    }

    /**
     * Getting All Images Path.
     *
     * Required Storage Permission
     *
     * @return ArrayList with images Path
     */
    internal fun loadImagesfromSDCard(): ArrayList<String> {
        val uri: Uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
        val cursor: Cursor?
        val column_index_data: Int
        val column_index_folder_name: Int
        val listOfAllImages = ArrayList<String>()
        var absolutePathOfImage: String? = null

        val projection = arrayOf(MediaStore.MediaColumns.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME)

        cursor = AppController.globalContentResolvere!!.query(uri, projection, null, null, null)

        column_index_data = cursor!!.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA)
        column_index_folder_name = cursor!!
            .getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME)
        while (cursor!!.moveToNext()) {
            absolutePathOfImage = cursor!!.getString(column_index_data)
            listOfAllImages.add(absolutePathOfImage)
        }
        return listOfAllImages
    }

    fun getAllImages() {
        launch(Dispatchers.Main) {
            imagesLiveData.value = withContext(Dispatchers.IO) {
                loadImagesfromSDCard()
            }
        }
    }
}

And then use viewModel

 val imageViewModel = ViewModelProviders.of(this).get(ImageViewModel::class.java)

    imageViewModel.getImageList().observe(this, Observer<List<String>> { listOfImage ->
        imageWidgetStatus.text = """ Found ${listOfImage.size} Images"""


    // load images
    imageViewModel.getAllImages()

这篇关于将图库中的所有图像加载到 android 中的应用程序中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆