Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.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
如何在android gallery上显示特定文件夹中的图像_Android_Image_Gallery_Directory - Fatal编程技术网

如何在android gallery上显示特定文件夹中的图像

如何在android gallery上显示特定文件夹中的图像,android,image,gallery,directory,Android,Image,Gallery,Directory,如何在android gallery上显示特定文件夹中的所有图像,例如Tapp所做的。 我正在使用MediaScannerConnectionClient File folder = new File("/sdcard/myfolder/"); allFiles = folder.list(); SCAN_PATH=Environment.getExternalStorageDirectory().toString()+"/myfolder/"+allFiles[0]; @Override pu

如何在android gallery上显示特定文件夹中的所有图像,例如Tapp所做的。 我正在使用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/*");
}
但我在这一点上犯了个错误:

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(uri);
    startActivity(intent);
具体如下:

startActivity(intent);
无法获取以下项的类型:content://media/external/images/media/267830 未找到可处理意图的活动


在onScanCompleted上,我的路径和uri参数不为空。

您好,您可以使用下面的代码,希望对您有所帮助

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

    }
}

@Talha给出的答案很好,但它尝试使用图像应用程序选项打开图像。如果您只想用sd卡中的文件夹刷新gallery,您可以修改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();
    }

}
在按钮单击中,在您从中获取的每个文件上循环:

    File folder = new File(Environment.getExternalStorageDirectory().getPath()+"/aaaa/");
    allFiles = folder.listFiles();
然后一次一个传给SingleMediaScanner


它在我的例子中起作用。

您应该添加网格视图适配器类

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;

            }
        });

    }
}
活动:

活动\图库\图片:


另一个活动布局:


您可以使用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;
        }
    }
}

您可以使用“我的方式”从SD卡上的特定文件夹获取图像,也可以删除文件

主要活动

    FileAdapter fileAdapter;
    RecyclerView recyclerView;
    ArrayList<String> filePath = new ArrayList<>();
    ArrayList<String> filename = new ArrayList<>();
    private File[] listFile;
    File file;


    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    tv_empty =  findViewById(R.id.tv_empty);

    loadFiles();
    fileAdapter = new FileAdapter(this, filePath, filename);

    recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
    recyclerView.setAdapter(fileAdapter);
    fileAdapter.notifyDataSetChanged();


    private void loadFiles() {
        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            Toast.makeText(getActivity(), "Error! No SDCARD Found!", Toast.LENGTH_LONG).show();
        } else {
            file = new File(Environment.getExternalStorageDirectory().getPath() + "/StorySaver");
            if (!file.exists()) {
                file.mkdirs();
            }
        }

        filePath.clear();
        filename.clear();
        if (file.isDirectory()) {
            listFile = file.listFiles();
            for (File absolutePath : listFile) {
                filePath.add(absolutePath.getAbsolutePath());
                filename.add(absolutePath.getName());
            }
        }

        if (filePath.size() == 0) {
            tv_empty.setVisibility(View.VISIBLE);
        } else {
            tv_empty.setVisibility(View.GONE);
        }
    }
FileAdapter文件适配器;
回收视图回收视图;
ArrayList filePath=新的ArrayList();
ArrayList文件名=新的ArrayList();
私有文件[]列表文件;
文件;
recyclerView=(recyclerView)findViewById(R.id.recyclerView);
tv_empty=findviewbyd(R.id.tv_empty);
加载文件();
fileAdapter=新的fileAdapter(此,文件路径,文件名);
setLayoutManager(新的GridLayoutManager(this,3));
setAdapter(fileAdapter);
fileAdapter.notifyDataSetChanged();
私有void加载文件(){
如果(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Toast.makeText(getActivity(),“错误!找不到SD卡!”,Toast.LENGTH\u LONG.show();
}否则{
file=新文件(Environment.getExternalStorageDirectory().getPath()+“/StorySaver”);
如果(!file.exists()){
mkdirs()文件;
}
}
filePath.clear();
filename.clear();
if(file.isDirectory()){
listFile=file.listFiles();
对于(文件绝对路径:listFile){
添加(absolutePath.getAbsolutePath());
add(absolutePath.getName());
}
}
if(filePath.size()==0){
tv_empty.setVisibility(视图可见);
}否则{
tv_empty.setVisibility(View.GONE);
}
}
MyAdapter

public class FileAdapter extends RecyclerView.Adapter<FileAdapter.CustomViewHolder> {
        ArrayList<String> filepath;
        ArrayList<String> filename;
        public Context mContext;
        File file;

        public class CustomViewHolder extends RecyclerView.ViewHolder {
            TextView content;
            ImageView imageView;

            public CustomViewHolder(final View view) {
                super(view);
                this.content = (TextView) view.findViewById(R.id.content);
                this.imageView = (ImageView) view.findViewById(R.id.image);
            }
        }

        public FileAdapter(Context context, ArrayList<String> filepath, ArrayList<String> filename) {
            this.filepath = filepath;
            this.filename = filename;
            this.mContext = context;
        }


        public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            return new CustomViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_file, null));
        }

        public void onBindViewHolder(CustomViewHolder customViewHolder, final int i) {
            file = new File(filepath.get(i));
            customViewHolder.content.setText(filename.get(i));
            Glide.with(this.mContext).load(filepath.get(i)).into(customViewHolder.imageView);
            customViewHolder.imageView.setOnLongClickListener(new OnLongClickListener() {
                public boolean onLongClick(View view) {
                    Builder builder = new Builder(mContext);
                    builder.setMessage("Are you sure you want delete this?");
                    builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialogInterface, int v) {
                            if (file.exists()) {
                                file.delete();
                            }
                            filepath.remove(i);
                            notifyDataSetChanged();
                        }
                    });
                    builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialogInterface, int i) {
                            dialogInterface.cancel();
                        }
                    });
                    builder.show();
                    return false;
                }
            });

            customViewHolder.imageView.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {

                    Intent intent = new Intent();
                    intent.setAction(android.content.Intent.ACTION_VIEW);
                    Uri data = FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID + ".provider", new File(filepath.get(i)));
                    intent.setDataAndType(data, "*/*");
                    try {
                        String substring = filename.get(i).substring(filename.get(i).lastIndexOf("."));

                        if (substring.equals(".jpg")) {
                            intent.setDataAndType(data, "image/*");
                        } else if (substring.equals(".mp4")) {
                            intent.setDataAndType(data, "video/*");
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    try {
                        mContext.startActivity(intent);
                    } catch (ActivityNotFoundException unused) {
                        Toast.makeText(mContext, "No application available", Toast.LENGTH_SHORT).show();
                    }
                }
            });

        }

        public int getItemCount() {
            return filepath.size();
        }
    }
公共类FileAdapter扩展了RecyclerView.Adapter{ ArrayList文件路径; ArrayList文件名; 公共语境; 文件; 公共类CustomViewHolder扩展了RecyclerView.ViewHolder{ 文本视图内容; 图像视图图像视图; 公共CustomViewHolder(最终视图){ 超级(视图); this.content=(TextView)view.findViewById(R.id.content); this.imageView=(imageView)view.findviewbyd(R.id.image); } } 公共文件适配器(上下文上下文、ArrayList文件路径、ArrayList文件名){ this.filepath=filepath; this.filename=文件名; this.mContext=上下文; } 公共CustomViewHolder onCreateViewHolder(视图组视图组,int i){ 返回新的CustomViewHolder(LayoutInflater.from(viewGroup.getContext()).flate(R.layout.row_文件,null)); } BindViewHolder上的公共无效(CustomViewHolder CustomViewHolder,最终int i){ file=新文件(filepath.get(i)); customViewHolder.content.setText(filename.get(i)); Glide.with(this.mContext).load(filepath.get(i)).in(customViewHolder.imageView); customViewHolder.imageView.setOnLongClickListener(新的OnLongClickListener(){ 仅长按公共布尔值(视图){ 生成器=新生成器(mContext); setMessage(“确实要删除此项吗?”); builder.setPositiveButton(“是”,新建DialogInterface.OnClickListener(){ 公共void onClick(DialogInterface,intv){ if(file.exists()){ delete(); } filepath.remove(i); notifyDataSetChanged(); } }); setNegativeButton(“否”,新的DialogInterface.OnClickListener(){ 公共void onClick(DialogInterface,inti){ dialogInterface.cancel(); } }); builder.show(); 返回false; } }); customViewHolder.imageView.setOnClickListener(新的OnClickListener(){ @凌驾 公共void onClick(视图v){ 意图=新意图(); setAction(android.content.intent.ACTION\u视图); Uri data=FileProvider.getUriForFile(mContext,BuildConfig.APPLICATION_ID+“.provider”,新文件(filepath.get(i)); intent.setDataAndType(数据“*/*”); 试一试{ String substring=filename.get(i).substring(filename.get(i).lastIndexOf(“.”); if(子字符串等于(“.jpg”)){ intent.setDataAndType(数据,“image/*”); }else if(子字符串等于(“.mp4”)){ intent.setDataAndType(数据,“video/*”); } }捕获(例外e){
public class FileAdapter extends RecyclerView.Adapter<FileAdapter.CustomViewHolder> {
        ArrayList<String> filepath;
        ArrayList<String> filename;
        public Context mContext;
        File file;

        public class CustomViewHolder extends RecyclerView.ViewHolder {
            TextView content;
            ImageView imageView;

            public CustomViewHolder(final View view) {
                super(view);
                this.content = (TextView) view.findViewById(R.id.content);
                this.imageView = (ImageView) view.findViewById(R.id.image);
            }
        }

        public FileAdapter(Context context, ArrayList<String> filepath, ArrayList<String> filename) {
            this.filepath = filepath;
            this.filename = filename;
            this.mContext = context;
        }


        public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            return new CustomViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_file, null));
        }

        public void onBindViewHolder(CustomViewHolder customViewHolder, final int i) {
            file = new File(filepath.get(i));
            customViewHolder.content.setText(filename.get(i));
            Glide.with(this.mContext).load(filepath.get(i)).into(customViewHolder.imageView);
            customViewHolder.imageView.setOnLongClickListener(new OnLongClickListener() {
                public boolean onLongClick(View view) {
                    Builder builder = new Builder(mContext);
                    builder.setMessage("Are you sure you want delete this?");
                    builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialogInterface, int v) {
                            if (file.exists()) {
                                file.delete();
                            }
                            filepath.remove(i);
                            notifyDataSetChanged();
                        }
                    });
                    builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialogInterface, int i) {
                            dialogInterface.cancel();
                        }
                    });
                    builder.show();
                    return false;
                }
            });

            customViewHolder.imageView.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {

                    Intent intent = new Intent();
                    intent.setAction(android.content.Intent.ACTION_VIEW);
                    Uri data = FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID + ".provider", new File(filepath.get(i)));
                    intent.setDataAndType(data, "*/*");
                    try {
                        String substring = filename.get(i).substring(filename.get(i).lastIndexOf("."));

                        if (substring.equals(".jpg")) {
                            intent.setDataAndType(data, "image/*");
                        } else if (substring.equals(".mp4")) {
                            intent.setDataAndType(data, "video/*");
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    try {
                        mContext.startActivity(intent);
                    } catch (ActivityNotFoundException unused) {
                        Toast.makeText(mContext, "No application available", Toast.LENGTH_SHORT).show();
                    }
                }
            });

        }

        public int getItemCount() {
            return filepath.size();
        }
    }