我有一个使用专门创建的二进制(.gcsb)文件类型的应用程序.这些文件保存在SD卡上的文件夹中.
目前,他们使用ES文件浏览器移动或关闭,或者手机制造商的行为类似于USB驱动器的转移实用程序.笨重.我想要的是能够将文件通过电子邮件发送到手机,然后从gmail中打开文件作为附件,这应该启动应用程序,然后将应用程序保存到相应的SD卡文件夹中.
我发现了一些关于设置意图的东西 – 希望 – 在gmail(特别是Open custom Gmail attachment in my Android app)中单击“预览”启动应用程序,但我完全不确定如何访问文件数据!我想它必须与Intent.get … Extra()函数之一,但是哪个,以及如何使用它?
解决方法
找到了怎么做.希望这可以帮助别人.派对矿,部分来自其他职位.它的目标是处理.gcsb文件附件.
意图过滤器是
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.BROWSABLE" />
- <data android:mimeType="application/octet-stream" />
- </intent-filter>
并且活动onCreate()/ onRestart()中的代码是
- Intent intent = getIntent();
- InputStream is = null;
- FileOutputStream os = null;
- String fullPath = null;
- try {
- String action = intent.getAction();
- if (!Intent.ACTION_VIEW.equals(action)) {
- return;
- }
- Uri uri = intent.getData();
- String scheme = uri.getScheme();
- String name = null;
- if (scheme.equals("file")) {
- List<String> pathSegments = uri.getPathSegments();
- if (pathSegments.size() > 0) {
- name = pathSegments.get(pathSegments.size() - 1);
- }
- } else if (scheme.equals("content")) {
- Cursor cursor = getContentResolver().query(uri,new String[] {
- MediaStore.MediaColumns.DISPLAY_NAME
- },null,null);
- cursor.moveToFirst();
- int nameIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
- if (nameIndex >= 0) {
- name = cursor.getString(nameIndex);
- }
- } else {
- return;
- }
- if (name == null) {
- return;
- }
- int n = name.lastIndexOf(".");
- String fileName,fileExt;
- if (n == -1) {
- return;
- } else {
- fileName = name.substring(0,n);
- fileExt = name.substring(n);
- if (!fileExt.equals(".gcsb")) {
- return;
- }
- }
- fullPath = ""/* create full path to where the file is to go,including name/ext */;
- is = getContentResolver().openInputStream(uri);
- os = new FileOutputStream(fullPath);
- byte[] buffer = new byte[4096];
- int count;
- while ((count = is.read(buffer)) > 0) {
- os.write(buffer,count);
- }
- os.close();
- is.close();
- } catch (Exception e) {
- if (is != null) {
- try {
- is.close();
- } catch (Exception e1) {
- }
- }
- if (os != null) {
- try {
- os.close();
- } catch (Exception e1) {
- }
- }
- if (fullPath != null) {
- File f = new File(fullPath);
- f.delete();
- }
- }
它似乎适用于标准的Android gmail和邮件应用程序.根据是否在gmail中按下“下载”(方案文件)或“预览”(方案内容),可以获得两种不同的文件名.
请注意,将活动设置为单个实例非常重要.