使用文件在打开时生成的意图在Android中接收文件

时间:2017-08-28 18:13:44

标签: java android android-intent deserialization

我的应用程序可以序列化对象并通过WhatsApp将其发送到另一部手机:

FullRecipe fr = new FullRecipe(data);
String extension = ".rec";
String name = "recipe";    
File sdcard = Environment.getExternalStorageDirectory();
File file = new File(sdcard, name + extension);

try {
    FileOutputStream fos = new FileOutputStream(file);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(fr);
    oos.close();
    fos.close();
} catch (IOException e) {
    e.printStackTrace();
}

Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("application/rec");
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
intent.setPackage("com.whatsapp");
startActivity(intent);

我使用自定义文件扩展名并在我的Manifest中添加了intent-filters,因此如果我尝试通过在WhatsApp中单击它来打开文件,我的应用程序将出现在应用程序选择器中。 现在我想使用以下代码反序列化单击的文件:

FullRecipe fr;
Intent intent = getIntent();
Uri data = intent.getData();
String path = data.getPath();
try {
    FileInputStream fis = new FileInputStream(path);
    ObjectInputStream ois = new ObjectInputStream(fis);
    fr = (FullRecipe) ois.readObject();
    ois.close();
    fis.close();
} catch (IOException e) {
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

当我点击WhatsApp中发送的文件并选择我的应用程序时,我的应用程序启动(它收到意图),但我收到此错误:

java.io.FileNotFoundException: /item/86477: open failed: ENOENT (No such file or directory)

显然'/ item / 86477'不是一个合适的文件路径,但我怎样才能找到合适的文件路径?

1 个答案:

答案 0 :(得分:0)

  

但我怎样才能找到合适的人?

你没有,因为它不是文件而且没有路径。

使用ContentResolveropenInputStream()获取InputStream标识的内容Uri

然后,重新考虑你的计划。并非所有人都将他们的应用更新到最新版本,更不用说快速了。如果在版本之间更改FullRecipe的结构,现在您将具有不兼容的序列化(旧的和新的),并且您需要以某种方式以编程方式协调它。