java - 如何将文件从文件选择器传递给函数?
问题描述
我有一个打开文件选择器的应用程序,它在 Toast 消息中输出该文件的路径。但我想更改它,以便我选择的文件作为参数传递给函数。
我的活动如下所示:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.btn_picker);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
startActivityForResult(intent, 7);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
switch (requestCode) {
case 7:
if (resultCode == RESULT_OK) {
String PathHolder = data.getData().getPath();
Toast.makeText(MainActivity.this, "The Files path is: "+ PathHolder, Toast.LENGTH_LONG).show();
}
break;
}
}
}
它做了它应该做的事情,但不是输出文件路径,而是我想调用该函数
importToFile()
从管理类。
我想做这样的事情:
manage.importToFile(File1)
其中 File1 是我从文件选择器中选择的文件。
我怎样才能做到这一点。
提前致谢。
解决方案
您可以在 android 中使用File类来处理文件。创建一个File
使用所选文件路径的实例并将其传递给您的该方法。像这样的东西:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
switch (requestCode) {
case 7:
if (resultCode == RESULT_OK) {
// as @Taseer Ahmad said its not a good way to get path of the file.
//String PathHolder = data.getData().getPath();
String PathHolder = getPath(this, data.getData());
if (!TextUtils.isEmpty(PathHolder)) {
File file = new File(PathHolder);
manager.importToFile(file);
Toast.makeText(MainActivity.this, "The Files path is: "+ PathHolder, Toast.LENGTH_LONG).show();
}
}
break;
}
}
编辑
正如@Taseer Ahmad 所说,data.getData().getPath()
不是获取所选文件路径的安全方法。这段代码是从这里复制的。
public static String getPath(Context context, Uri uri) throws URISyntaxException {
if ("content".equalsIgnoreCase(uri.getScheme())) {
String[] projection = { "_data" };
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(uri, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow("_data");
if (cursor.moveToFirst()) {
return cursor.getString(column_index);
}
} catch (Exception e) {
// Eat it
}
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
推荐阅读
- java - Java中使用JGAP库的遗传算法
- c - 如何在 C 中多次“重用”一个线程?
- vb.net - 泛型函数内部忽略重载
- flutter - 我怎样才能从地图上收集所有的公斤值
- javascript - 有没有办法在页面加载后包含的元素上使用脚本?
- python - 内核未在 Jupyter Lab 中连接
- css - 如何防止从模态进一步向下滚动?
- angular - 如何在Angular中添加表单元素并动态获取数据?
- android - Visual Studio Xamarin Forms 项目未在 bin/debug/netstandard2.0 目录下创建项目 dll 文件
- html - 当我将 css 链接到 html 时,为什么没有显示某些 css 样式?