【问题标题】:How to respond to 'attach' from Gmail? Responding to intent with attachment如何回复来自 Gmail 的“附加”?用附件回应意图
【发布时间】:2015-03-20 18:10:24
【问题描述】:

我正在编写一个安卓应用程序。这个应用程序是建立在 Gmail 之上的。我想添加从其他应用程序附加文件的功能。我正在使用的第一个应用程序是自定义 Box 应用程序(使用 box sdk 制作)。我目前可以发送一个意图,在 Box 应用程序中打开一个活动,选择一个附件,然后返回。但是,在我的 Box-SDK 应用程序中,一旦选择了一个项目,我不知道如何将其转换为可以正确发送回我的 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);
    }
}

【问题讨论】:

  • 我设法弄清楚了,通过将结果设置为一个新的意图,文件 uri 作为额外的 Intent result2 = new Intent(); result2.setData(Uri.parse("file://" + f.getAbsolutePath())); getActivity().setResult(Activity.RESULT_OK, result2);

标签: android email android-intent gmail attachment


【解决方案1】:

尝试使用文件提供程序:

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

从页面:

“有多种方法可以将文件的内容 URI 提供给客户端应用程序。一种常见的方法是客户端应用程序通过调用 startActivityResult() 来启动您的应用程序,该方法会向您的应用程序发送一个 Intent 以启动应用程序中的 Activity。作为响应,您的应用程序可以立即向客户端应用程序返回内容 URI,或显示允许用户选择文件的用户界面。在后一种情况下,一旦用户选择文件,您的应用程序就可以返回它的内容 URI。在这两种情况下,您的应用都会在通过 setResult() 发送的 Intent 中返回内容 URI"

来自另一个 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) {

    }
}
}  

我们可以修改这段代码,上面写着 //Do What you want with the _data, just call

public final void setResult (int resultCode, Intent data)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多