如何在android gallery上显示特定文件夹中的图像
如何在android gallery上显示特定文件夹中的所有图像,例如Tapp所做的。 我正在使用MediaScannerConnectionClient如何在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
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();
}
}