我认为这很容易但事实证明不幸的是。
是)我有的:
我的外部存储器上有一个名为“myFolder”的文件夹(不是SD卡,因为它是Nexus 4,但这应该不是问题)。该文件夹包含一些*.csv
文件。
我想要的是:
我想编写一个执行以下操作的方法:显示各种应用程序(文件浏览器),我可以从中选择一个(见图片)。单击它后,所选的文件浏览器应该启动并显示“myFolder”的内容。不多也不少。
我的问题:
我到底该怎么做?我想我接下来的代码非常接近,但无论我做什么 - 而且我确定必须有一些我还没有做到的事情 - 它始终只打开来自外部存储器的主文件夹。
public void openFolder()
{
File file = new File(Environment.getExternalStorageDirectory(),
"myFolder");
Log.d("path", file.toString());
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setDataAndType(Uri.fromFile(file), "*/*");
startActivity(intent);
}
这应该工作:
Uri selectedUri = Uri.parse(Environment.getExternalStorageDirectory() + "/myFolder/");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(selectedUri, "resource/folder");
if (intent.resolveActivityInfo(getPackageManager(), 0) != null)
{
startActivity(intent);
}
else
{
// if you reach this place, it means there is no any file
// explorer app installed on your device
}
请确保您的设备上安装了任何文件资源管理器应用。
编辑:从评论中添加了shantanu的推荐。
图书馆:如果当前的解决方案对您没有帮助,您还可以查看这些文件/目录选择器库https://android-arsenal.com/tag/35。
我终于搞定了。这样,选择器(Google Drive,Dropbox,Root Explorer和Solid Explorer)只显示几个应用程序。它与两个浏览器一起工作正常,但不适用于Google Drive和Dropbox(我猜是因为它们无法访问外部存储)。另一种MIME类型如"*/*"
也是可能的。
public void openFolder(){
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()
+ File.separator + "myFolder" + File.separator);
intent.setDataAndType(uri, "text/csv");
startActivity(Intent.createChooser(intent, "Open folder"));
}
Intent chooser = new Intent(Intent.ACTION_GET_CONTENT);
Uri uri = Uri.parse(Environment.getDownloadCacheDirectory().getPath().toString());
chooser.addCategory(Intent.CATEGORY_OPENABLE);
chooser.setDataAndType(uri, "*/*");
// startActivity(chooser);
try {
startActivityForResult(chooser, SELECT_FILE);
}
catch (android.content.ActivityNotFoundException ex)
{
Toast.makeText(this, "Please install a File Manager.",
Toast.LENGTH_SHORT).show();
}
在上面的代码中,如果setDataAndType为“* / *”,则打开内置文件浏览器以选择任何文件,如果我设置了“text / plain”,则打开Dropbox。我安装了Dropbox,Google云端硬盘。如果我卸载Dropbox,只有“* / *”可以打开文件浏览器。这是Android 4.4.2。我可以通过getContentResolver()。openInputStream(data.getData())从Dropbox和Google Drive下载内容。
此代码适用于OI文件管理器:
File root = new File(Environment.getExternalStorageDirectory().getPath()
+ "/myFolder/");
Uri uri = Uri.fromFile(root);
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setData(uri);
startActivityForResult(intent, 1);
你可以在这里获得OI文件管理器:http://www.openintents.org/en/filemanager
今天,您应该使用其内容来表示文件夹:从存储访问框架获取的URI,打开它应该如下所示:
Intent i = new Intent(Intent.ACTION_VIEW, uri);
startActivity(i);
唉,当您使用外部存储提供程序尝试此操作时,Files应用程序当前包含一个导致其崩溃的错误。但是,可以通过这种方式显示来自第三方提供商的文件夹。
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("text/csv");
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(Intent.createChooser(intent, "Select a File to Upload"), 0);
} catch (android.content.ActivityNotFoundException ex) {
ex.printStackTrace();
}
那么你只需要添加响应
public void onActivityResult(int requestCode, int resultCode, Intent data){
switch (requestCode) {
case 0: {
//what you want to do
//file = new File(uri.getPath());
}
}
}
File temp = File.createTempFile("preview", ".png" );
String fullfileName= temp.getAbsolutePath();
final String fileName = Uri.parse(fullfileName)
.getLastPathSegment();
final String filePath = fullfileName.
substring(0,fullfileName.lastIndexOf(File.separator));
Log.d("filePath", "filePath: " + filePath);
完整的文件名:
/模拟题/SD card/download_manager_Farsi/preview.PNG
文件路径:
的/ mnt / SD卡/ Download_Manager_Farsi
你似乎很亲密。
我会尝试像这样设置URI:
String folderPath = Environment.getExternalStorageDirectory()+"/pathTo/folder";
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
Uri myUri = Uri.parse(folderPath);
intent.setDataAndType(myUri , "file/*");
startActivity(intent);
但它与你所尝试的并没有太大的不同。告诉我们它是否有变化?
还要确保目标文件夹存在,并在将其发送到intent之前查看生成的Uri对象,它可能不是我们所期望的。