[英]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发送文件是另外一回事:
您可以创建到服务器的套接字连接并发送它。 您当然要同时编写客户端和服务器端。 可以在此处找到一个示例: 通过套接字发送文件...
您可以使用ftp服务器并将其上传到该服务器。 您可以使用任何服务器。 示例: 使用的是Apache ftp客户端库(开放源代码)
您可以使用http请求并将其设为帖子(此方法仅适用于小文件)示例: 通过HTTP通过POST发送文件
您还可以使用dropbox api或amazon s3 sdk,因此您不必担心任何连接问题和重试等等,最后您将获得指向该文件的链接并传递该链接。
一种。 DropBox API: 文档
湾 Amazon S3 SDK API: 文档
C。 Google云端硬盘API: 文档使用Google云端硬盘的优势。
问候
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.