2015-01-22 4 views
1

Я пишу приложение для Android. Это приложение построено поверх Gmail. Я хочу добавить возможность прикреплять файлы из других приложений. Первое приложение, над которым я работаю, - это специальное приложение Box (сделанное с помощью окна sdk). В настоящее время я могу отправить намерение, открыть мероприятие в приложении «Ящик», выбрать вложение и вернуться. Однако в моем приложении Box-SDK после выбора элемента я понятия не имею, как превратить его в данные, которые я могу правильно отправить обратно в свое приложение Gmail (или любой исходный отправитель намерения). Я также не знаю, как отправить эти данные отправителю намерения.Как отреагировать на 'attach' из Gmail? Ответ на намерение с приложением

Я знаю, что setResult() задействован, но я не уверен, куда его поместить или как правильно его использовать для переноса данных, выбранных в поле в приложении электронной почты.

Что происходит в данный момент, оно просто возвращается в gmail без вложения и говорит, что загрузка завершена.

Вот код, который я в настоящее время:

private void onFileSelected(final int resultCode, final Intent data) { 
     if (Activity.RESULT_OK != resultCode) { 
      Toast.makeText(this, "fail", Toast.LENGTH_LONG).show(); 
     } 
     else { 
      final BoxAndroidFile file =  data.getParcelableExtra(FilePickerActivity.EXTRA_BOX_ANDROID_FILE); 
      AsyncTask<Null, Integer, Null> task = new AsyncTask<Null, Integer, Null>() { 

       @Override 
       protected void onPostExecute(Null result) { 
        Toast.makeText(MainActivity.this, "done downloading", Toast.LENGTH_LONG).show(); 
//     Intent result2 = new Intent(); 
//     result2.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" +)); 
//     setResult(Activity.RESULT_OK, result2); 
////     setResult(resultCode, data); 
        super.onPostExecute(result); 
        finish(); 
       } 

       @Override 
       protected void onPreExecute() { 
        Toast.makeText(MainActivity.this, "start downloading", Toast.LENGTH_LONG).show(); 
        super.onPreExecute(); 
       } 

       @Override 
       protected Null doInBackground(Null... params) { 
        BoxAndroidClient client = ((HelloWorldApplication) getApplication()).getClient(); 
        try { 
         File f = new File(Environment.getExternalStorageDirectory(), file.getName()); 
         Intent result2 = new Intent(); 
         result2.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + f.getAbsolutePath())); 
         setResult(Activity.RESULT_OK, data); 
//      setResult(resultCode, data); 
         System.out.println(f.getAbsolutePath()); 
         client.getFilesManager().downloadFile(file.getId(), f, null, null); 
        } 
        catch (Exception e) { 
        } 
        return null; 
       } 
      }; 
      task.execute(); 

     } 
    } 




@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == AUTH_REQUEST) { 
     onAuthenticated(resultCode, data); 
    } 
    else if (requestCode == UPLOAD_REQUEST) { 
     onFolderSelected(resultCode, data); 
    } 
    else if (requestCode == DOWNLOAD_REQUEST) { 
     onFileSelected(resultCode, data); 
    } 
} 
+0

мне удалось понять это, установив результат нового намерения с файлом URI в качестве дополнительного намерение result2 = новый Intent(); result2.setData (Uri .parse ("file: //" + f.getAbsol utePath())); getActivity(). SetResult (Activity.RESULT_OK, result2); –

ответ

0

Попробуйте использовать поставщик файла:

https://developer.android.com/reference/android/support/v4/content/FileProvider.html#ServeUri

На странице:

«Есть множество способов обслуживать URI содержимого для файла для клиентского приложения. Один из распространенных способов заключается в том, чтобы клиентское приложение запускало ваше приложение, вызвав startActivityResult(), который отправляет намерение к вашему приложению, чтобы начать действие в вашем приложении. В ответ ваше приложение может немедленно вернуть URI контента в клиентское приложение или предоставить пользовательский интерфейс, который позволяет пользователю выбирать файл. В последнем случае, как только пользователь выбирает файл, ваше приложение может вернуть свой URI содержимого. В обоих случаях, ваше приложение возвращает содержимое URI в Intent, присланных через setResult()»

С другой StackOverflow ответа:

public void showCameraScreen(View view) { 
// BUILT IN CAMERA 
Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
camera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile(this))); 
this.startActivityForResult(camera, 1); 

} 

private File getTempFile(Context context) { 
// it will return /sdcard/MyImage.tmp 
final File path = new File(Environment.getExternalStorageDirectory(), context.getPackageName()); 
if (!path.exists()) { 
    path.mkdir(); 
} 
return new File(path, "MyImage.tmp"); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
if (requestCode == 1 && resultCode == RESULT_OK) { 
    final File file = getTempFile(this); 

    byte[] _data = new byte[(int) file.length()]; 
    try { 
     InputStream in = new FileInputStream(file); 
     in.read(_data); 
     in.close(); 
     in = null; 
     //DO WHAT YOU WANT WITH _data. The byte array of your image. 
    } catch (Exception E) { 

    } 
} 
} 

Мы можем изменить этот код, где он говорит: // делать то, что вы хотите с _DATA, просто позвоните

public final void setResult (int resultCode, Intent data)