我知道我的问题已经多次解决,但我找不到任何可以帮助我解决特定问题的事情。
我打算从系统中的任何地方选择一个文件:
private void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(
Intent.createChooser(intent, "Select a File to Upload"),
FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
// Potentially direct the user to the Market with a Dialog
Toast.makeText(this, "Please install a File Manager.",
Toast.LENGTH_SHORT).show();
}
}
我在这里接受了这个意图:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case FILE_SELECT_CODE:
if (resultCode == RESULT_OK) {
// Get the Uri of the selected file
Uri uri = data.getData();
}
我有一个像这样的上传方法:
private void upload(File file){
RequestParams params = new RequestParams();
try {
params.put("fileToUpload", file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
AsyncHttpClient client = new AsyncHttpClient();
client.post("http://...", params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
System.out.println("statusCode "+statusCode);//statusCode 200
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
}
});
}
问题是我不知道如何结婚"关于活动和上传的两种方法,因为我不知道如何处理从intent获得的信息,以便AsyncHttpClient可以使用它。
我尝试将Uri转换为绝对路径,但无法管理(在线解决方案似乎适用于专门用于图像的解决方案)。我也不能"转换" uri到文件。
我能做到这一点吗?我错过了什么吗?
答案 0 :(得分:4)
理想的解决方案是使用ContentResolver
和openInputStream()
获取InputStream
标识的内容Uri
,然后将InputStream
传递给您用于上传的HTTP客户端API。
如果您的HTTP客户端API不支持使用InputStream
或某些内容(例如Reader
),那么您需要File
,请使用InputStream
和FileOutputStream
在您控制的某个文件上制作内容的本地副本(例如,在getCacheDir()
中)。然后,使用本地副本进行文件上载操作,并在完成后删除本地副本。