代码之家  ›  专栏  ›  技术社区  ›  Oktawian

Android Studio-从库导入图像

  •  1
  • Oktawian  · 技术社区  · 8 年前

    我正在创建活动,以查看库中的图像(拍摄图像到个人资料照片),但我有三个问题:

    1) 有些照片是复制的
    2) 如果我要显示SD卡上的图像,它的加载时间大约为30秒
    3) 有视频的缩影

    也许有人知道怎么修吗?我想像Facebook、Instagram或Behance应用程序那样做

    import android.os.Environment;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.GridLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.support.v7.widget.Toolbar;
    
    import com.stagap.stagap.R;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    
    import static android.os.Environment.getExternalStoragePublicDirectory;
    
    public class GalleryActivity extends AppCompatActivity {
    
        private Toolbar galleryToolbar;
        private RecyclerView recyclerGallery;
        private ArrayList<File> imageFiles;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_gallery);
            galleryToolbar = findViewById(R.id.galleryToolbar);
            setSupportActionBar(galleryToolbar);
            recyclerGallery = findViewById(R.id.recyclerGallery);
    
            GridLayoutManager gridLayoutManager = new GridLayoutManager(getBaseContext(), 3);
            recyclerGallery.setLayoutManager(gridLayoutManager);
            imageFiles = new ArrayList<>();
    
            readImages(getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), imageFiles);
    //        if(isExternalStorageAvailable() && !isExternalStorageReadOnly())
    //            readImages(Environment.getExternalStorageDirectory(), imageFiles);
            Collections.sort(imageFiles, new SortFolder());
    
            GalleryRecyclerAdapter adapter = new GalleryRecyclerAdapter(getBaseContext(), imageFiles);
            recyclerGallery.setAdapter(adapter);
            recyclerGallery.setHasFixedSize(true);
    
    
        }
    
        private void readImages(File root ,ArrayList<File> imageList) {
    
            File[] files = root.listFiles();
            for(File file: files){
    
                if(file.isDirectory()){
                    readImages(file, imageList);
                }else{
                    if(file.getName().endsWith(".png") ||
                            file.getName().endsWith(".jpeg") ||
                            file.getName().endsWith(".jpg")){
                            imageList.add(file);
                    }
                }
            }
        }
    
        class SortFolder implements Comparator<File> {
            @Override
            public int compare(File f1, File f2) {
                if (f1.lastModified() > (f2.lastModified())) {
                    return -1;
                } else if (f1.lastModified() < (f2.lastModified())) {
                    return +1;
                } else {
                    return 0;
                }
            }
        }
    
        private static boolean isExternalStorageAvailable() {
            String extStorageState = Environment.getExternalStorageState();
            if (Environment.MEDIA_MOUNTED.equals(extStorageState)) {
                return true;
            }
            return false;
        }
    
        private static boolean isExternalStorageReadOnly() {
            String extStorageState = Environment.getExternalStorageState();
            if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) {
                return true;
            }
            return false;
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Patroy    8 年前

    您的readImages方法有点过头了,AFAIK从手机内存加载照片的最佳做法如下:

        private int imagesQuantity = 40;
        private Context ctx;
        private Cursor cursor;
        private ArrayList<Bitmap> photos = new ArrayList<>(imagesQuantity);
        private ArrayList<Uri> uris = new ArrayList<>(imagesQuantity);
        private ArrayList<Bitmap> photos = new ArrayList<>(imagesQuantity);
    

    如上所述使用位图声明arrayList,读取方法如下所示,您可以更改一些参数,如读取照片的顺序(我想在您的情况下,DESC=降序是最好的

      String[] projection = new String[]{
                MediaStore.Images.ImageColumns._ID,
                MediaStore.Images.ImageColumns.DATA,
                MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
                MediaStore.Images.ImageColumns.DATE_TAKEN,
                MediaStore.Images.ImageColumns.MIME_TYPE,
        };
        cursor = ctx.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null,
                null, MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC");
        cursor.moveToFirst();
        for (int i = 1; i <= imagesQuantity; i++) {
            Bitmap bmp = BitmapFactory.decodeFile(cursor.getString(1));
            Uri imageUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, cursor.getInt(cursor.getColumnIndex(MediaStore.Images.ImageColumns._ID)));
            photos.add(bmp);
            uris.add(imageUri);
            cursor.moveToNext();
        }
    }