2017-01-24 3 views
1

Я знаю, что моя проблема уже решена несколько раз, но я не мог найти ничего, что помогло бы мне с моей конкретной проблемой.сбор файла для загрузки файла async-http (uri to file path)

У меня есть намерение, чтобы выбрать файл в любом из системы:

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) { 

     } 
    }); 
} 

проблема заключается в том, что я не знаю, как «жениться» на двух методах onActivity и upload, потому что я не знаю, как обрабатывать информацию, которую я получаю от намерения, чтобы AsyncHttpClient мог ее использовать.

Я попытался преобразовать Uri в абсолютный путь, но не мог управлять (решения в Интернете, которые, похоже, работали там, где специально для изображений). Я также не могу «преобразовать» uri в файл.

В любом случае я мог бы это сделать? Я что-то упускаю?

ответ

3

Идеальным решением является использование ContentResolver и openInputStream() получить InputStream на содержание идентифицированного Uri, а затем передать, что InputStream вашему HTTP клиента API для использования в загрузки.

Если ваш HTTP клиент API не поддерживает использование InputStream или что-то, что может быть получена от одного (например, Reader), и поэтому вам нужно File, использовать что InputStream и FileOutputStream на какой-то файл, который вы контролируете в сделать локальную копию содержимого (например, в getCacheDir()). Затем используйте локальную копию для операции загрузки файлов и удалите локальную копию, когда вы закончите.

+0

Да, спасибо, Async-Http позволяет использовать входной поток вместо файла. – hachel