繁体   English   中英

如何从Android应用发送文件

[英]How to send file from Android app

首先,我实际上已经通读了有关在Android上发送附件的多个线程。 就是说,我还没有找到解决问题的方法。

我的应用程序相对简单,用户输入数字,然后使用openFileOutput(filename,Context.MODE_APPEND);将其保存到“ values.csv”。

现在,这是我用来将文件附加到电子邮件并发送的代码(我是从其他文件线程之一获得的)。

 private void sendEmail(String email) {

    File file = getFileStreamPath(filename);
    Uri path = Uri.fromFile(file);
    Intent intent = new Intent(android.content.Intent.ACTION_SEND);
    intent.setType("application/octet-stream");
    intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Test");
    String to[] = { email };
    intent.putExtra(Intent.EXTRA_EMAIL, to);
    intent.putExtra(Intent.EXTRA_TEXT, "Testing...");
    intent.putExtra(Intent.EXTRA_STREAM, path);
    startActivityForResult(Intent.createChooser(intent, "Send mail..."),
            1222);
}

这将打开我的电子邮件客户端,该客户端除了附加文件外,其他所有操作均正确无误,向我显示了一条吐司通知,提示“文件不存在”。

我想念什么吗? 顺便说一句,我已经添加了读取和写入外部存储的权限。

任何和所有帮助将不胜感激。

编辑:我可以使用DDMS中的文件资源管理器模块,并导航到我的values.csv所在的/data/data/com.example.myapp/files/,并将其复制到我的计算机上,因此该文件确实存在。 我的代码一定有问题。

因此,除了使用MODE_WORLD_READABLE之外,附加电子邮件的另一种方法是使用ContentProvider。 这里有一个很好的教程可以做到这一点

但是我也很快会向您解释,然后您可以阅读该教程。

因此,首先您需要创建一个ContentProvider ,以提供对应用程序内部缓存中文件的访问。

public class CachedFileProvider extends ContentProvider {
public static final String AUTHORITY = "com.yourpackage.gmailattach.provider";
private UriMatcher uriMatcher;
@Override
public boolean onCreate() {
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    uriMatcher.addURI(AUTHORITY, "*", 1);
    return true;
}
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
    switch (uriMatcher.match(uri)) {
        case 1:// If it returns 1 - then it matches the Uri defined in onCreate
            String fileLocation = AppCore.context().getCacheDir() + File.separator +     uri.getLastPathSegment();
            ParcelFileDescriptor pfd = ParcelFileDescriptor.open(new File(fileLocation),     ParcelFileDescriptor.MODE_READ_ONLY);
            return pfd;
        default:// Otherwise unrecognised Uri
            throw new FileNotFoundException("Unsupported uri: " + uri.toString());
    }
}
@Override public int update(Uri uri, ContentValues contentvalues, String s, String[] as) { return     0; }
@Override public int delete(Uri uri, String s, String[] as) { return 0; }
@Override public Uri insert(Uri uri, ContentValues contentvalues) { return null; }
@Override public String getType(Uri uri) { return null; }
@Override public Cursor query(Uri uri, String[] projection, String s, String[] as1, String s1) {     return null; }
}

然后写一个临时文件

File tempDir = getContext().getCacheDir();
File tempFile = File.createTempFile("values", ".csv", tempDir);
fout = new FileOutputStream(tempFile);
fout.write(bytes);
fout.close();

然后将其传递给电子邮件

emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://" + 
CachedFileProvider.AUTHORITY + "/" + tempFile.getName()));

并且不要忘记将其添加到清单中

<provider android:name="CachedFileProvider" android:grantUriPermissions="true"
android:authorities="yourpackage.provider"></provider>

我看到了答案,当然还有问题。 您询问如何从android发送文件,但是在您的代码示例中,您正在谈论通过电子邮件发送。

那完全是两件事...

对于通过电子邮件发送,您已经有答案了,所以我完全不会输入。 从android发送文件是另外一回事:

  1. 您可以创建到服务器的套接字连接并发送它。 您当然要同时编写客户端和服务器端。 可以在此处找到一个示例: 通过套接字发送文件...

  2. 您可以使用ftp服务器并将其上传到该服务器。 您可以使用任何服务器。 示例: 使用的是Apache ftp客户端库(开放源代码)

  3. 您可以使用http请求并将其设为帖子(此方法仅适用于小文件)示例: 通过HTTP通过POST发送文件

  4. 您还可以使用dropbox api或amazon s3 sdk,因此您不必担心任何连接问题和重试等等,最后您将获得指向该文件的链接并传递该链接。

    一种。 DropBox API: 文档

    Amazon S3 SDK API: 文档

    C。 Google云端硬盘API: 文档使用Google云端硬盘的优势。

    1. 在Android上表现出色
    2. 身份验证要容易得多。
    3. “已用空间”在用户帐户上。

问候

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM