Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Studio-从图库导入图像_Java_Android_Gallery - Fatal编程技术网

Java Android Studio-从图库导入图像

Java Android Studio-从图库导入图像,java,android,gallery,Java,Android,Gallery,我正在创建活动,以查看图库中的图像(将图像拍摄到个人资料照片),但我有三个问题: 1) 有些照片是复制的 2) 如果我要显示SD卡上的图像,它将在30秒左右加载 3) 有视频的缩影 也许有人知道怎么修理它?我想像Facebook、Instagram或Behance应用程序那样做 import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; impo

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

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;
    }
}
导入android.os.Environment;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.support.v7.widget.GridLayoutManager;
导入android.support.v7.widget.RecyclerView;
导入android.support.v7.widget.Toolbar;
导入com.stagap.stagap.R;
导入java.io.File;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.Comparator;
导入静态android.os.Environment.getExternalStoragePublicDirectory;
公共类GalleryActivity扩展了AppCompatActivity{
专用工具栏galleryToolbar;
私人回收站查看回收站;
私有ArrayList图像文件;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gallery);
galleryToolbar=findViewById(R.id.galleryToolbar);
设置支持操作栏(galleryToolbar);
recyclerGallery=findViewById(R.id.recyclerGallery);
GridLayoutManager GridLayoutManager=新的GridLayoutManager(getBaseContext(),3);
setLayoutManager(gridLayoutManager);
imageFiles=newarraylist();
readImages(getExternalStoragePublicDirectory(Environment.DIRECTORY\u DCIM)、imageFiles);
//if(isExternalStorageAvailable()&&!isexternalstorageradonly())
//readImages(Environment.getExternalStorageDirectory(),imageFiles);
排序(imageFiles,new SortFolder());
GalleryRecyclerAdapter=新GalleryRecyclerAdapter(getBaseContext(),imageFiles);
recyclerGallery.setAdapter(适配器);
recyclerGallery.setHasFixedSize(true);
}
私有void readImages(文件根,ArrayList imageList){
File[]files=root.listFiles();
用于(文件:文件){
if(file.isDirectory()){
读取图像(文件、图像列表);
}否则{
if(file.getName().endsWith(“.png”)||
file.getName().endsWith(“.jpeg”)||
file.getName().endsWith(“.jpg”)){
imageList.add(文件);
}
}
}
}
类SortFolder实现了Comparator{
@凌驾
公共整数比较(文件f1、文件f2){
如果(f1.lastModified()>(f2.lastModified()){
返回-1;
}else if(f1.lastModified()<(f2.lastModified()){
返回+1;
}否则{
返回0;
}
}
}
私有静态布尔值isExternalStorageAvailable(){
字符串extStorageState=Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(extStorageState)){
返回true;
}
返回false;
}
私有静态布尔值isExternalStorageReadOnly(){
字符串extStorageState=Environment.getExternalStorageState();
if(Environment.MEDIA\u MOUNTED\u READ\u ONLY.equals(extStorageState)){
返回true;
}
返回false;
}
}

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

    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);
private int-imagesQuantity=40;
私有上下文ctx;
私有游标;
私有ArrayList照片=新ArrayList(imagesQuantity);
私有ArrayList URI=新ArrayList(imagesQuantity);
私有ArrayList照片=新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();
    }
}
String[]投影=新字符串[]{
MediaStore.Images.ImageColumns.\u ID,
MediaStore.Images.ImageColumns.DATA,
MediaStore.Images.ImageColumns.BUCKET\u显示\u名称,
MediaStore.Images.ImageColumns.DATE_拍摄日期,
MediaStore.Images.ImageColumns.MIME_类型,
};
cursor=ctx.getContentResolver().query(MediaStore.Images.Media.EXTERNAL\u CONTENT\u URI,投影,null,
空,MediaStore.Images.ImageColumns.DATE_take+“DESC”);
cursor.moveToFirst();
对于(int i=1;i