在两个特定的android应用程序之间共享文件
我正在编写应用程序A和B。我希望A能够向B发送任何给定mime类型的文件URI。我发现了一个,更像是一个pull,当我想将URI从a推送到B时,B没有请求。我也看到了,但它使用ACTION_SEND,在这种情况下,用户将看到一个应用程序列表,供选择。我只希望应用程序B专门接收文件URI。此外,我不希望应用程序B在有人出于不同目的执行动作时显示为一种选择。那么,如何将文件URI从一个特定应用发送到另一个特定应用 编辑1:向示例中添加一些代码段 在应用程序A中,我正在执行以下操作:在两个特定的android应用程序之间共享文件,android,android-sharing,Android,Android Sharing,我正在编写应用程序A和B。我希望A能够向B发送任何给定mime类型的文件URI。我发现了一个,更像是一个pull,当我想将URI从a推送到B时,B没有请求。我也看到了,但它使用ACTION_SEND,在这种情况下,用户将看到一个应用程序列表,供选择。我只希望应用程序B专门接收文件URI。此外,我不希望应用程序B在有人出于不同目的执行动作时显示为一种选择。那么,如何将文件URI从一个特定应用发送到另一个特定应用 编辑1:向示例中添加一些代码段 在应用程序A中,我正在执行以下操作: Intent t
Intent testIntent = new Intent("com.example.appB.TEST");
testIntent.addCategory(Intent.CATEGORY_DEFAULT);
testIntent.setData(Uri.parse("file:///mnt/sdcard/test.txt"));
startActivityForResult(testIntent, TEST);
在应用程序B中,我的清单中包含以下内容:
<activity
android:name="com.example.appB.mainActivity"
android:label="@string/app_name"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="com.example.appB.TEST" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="file"/>
<data android:mimeType="*/*"/>
</intent-filter>
</activity>
调用startActivity()
,将Uri
放入Intent
中。假设您正在跟踪,您只需在意图
上包含标记活动
授予读取权限
,B将临时访问该文件
我通过文件提供程序
共享PDF文件,然后让我的活动启动PDF查看器以查看该共享文件。在本例中,我的应用程序是A,PDF viewer应用程序是B。在B中调用startActivity()
,将Uri
放入意图中。假设您正在跟踪,您只需在意图
上包含标记活动
授予读取权限
,B将临时访问该文件
我通过
文件提供程序
共享PDF文件,然后让我的活动启动PDF查看器以查看该共享文件。在本例中,我的应用程序是A,PDF查看器应用程序是B。您可以执行以下操作:
Intent testIntent = new Intent("com.example.appB.TEST");
testIntent.addCategory(Intent.CATEGORY_DEFAULT);
testIntent.setData(Uri.parse("file:///mnt/sdcard/test.txt"));
startActivityForResult(testIntent, TEST);
1.使应用程序B实现自定义广播接收器
2.自定义广播将仅由应用程序A触发(广播)
3.应用程序B将捕获(侦听)广播消息,该消息也将包含文件URI
您可以为广播添加签名级别权限,以便其他应用程序可以拦截(侦听)您的广播。请参阅
android:permission广播公司必须拥有的权限名称
必须向广播接收器发送消息。如果此属性为
未设置,由元素的权限设置的权限
属性应用于广播接收器。如果两个属性都不是
设置时,接收方不受权限保护。更多
有关权限的信息,请参阅中的“权限”部分
简介和单独的文档、安全性和权限
同样,您也可以向文件Uri添加权限,以使其更安全。您可以执行以下操作:
Intent testIntent = new Intent("com.example.appB.TEST");
testIntent.addCategory(Intent.CATEGORY_DEFAULT);
testIntent.setData(Uri.parse("file:///mnt/sdcard/test.txt"));
startActivityForResult(testIntent, TEST);
1.使应用程序B实现自定义广播接收器
2.自定义广播将仅由应用程序A触发(广播)
3.应用程序B将捕获(侦听)广播消息,该消息也将包含文件URI
您可以为广播添加签名级别权限,以便其他应用程序可以拦截(侦听)您的广播。请参阅
android:permission广播公司必须拥有的权限名称
必须向广播接收器发送消息。如果此属性为
未设置,由元素的权限设置的权限
属性应用于广播接收器。如果两个属性都不是
设置时,接收方不受权限保护。更多
有关权限的信息,请参阅中的“权限”部分
简介和单独的文档、安全性和权限
同样,您也可以向文件Uri添加权限,使其更安全。我将使用两个应用程序都知道的自定义操作,这样它就不会使用其他应用程序知道要使用的通用操作。这就解决了不希望它出现在发送操作中的问题。这也意味着只有为您的自定义操作注册的应用程序才能接收它。不利的一面是,如果其他应用程序知道该操作使用什么字符串,它们可能会收到该意图 如果您想绝对确保只有B可以接收到意图,那么您可以指定一个组件。请参阅:如果您这样做,则意味着A必须知道B内部的某个组件,才能引导意图,从而降低B更改该组件名称的灵活性。但这确实意味着A的意图只能转移到B
请注意,您仍然不应该信任B中的意图。另一个应用程序可以指定操作字符串(反编译您的应用程序,或通过查看logcat找到它)和B的组件,并通过发送恶意意图。因此,请始终检查B中的输入。我将使用两个应用程序都知道的自定义操作,这样它就不会使用其他应用程序知道要使用的通用操作。这就解决了不希望它出现在发送操作中的问题。这也意味着只有为您的自定义操作注册的应用程序才能接收它。不利的一面是,如果其他应用程序知道该操作使用什么字符串,它们可能会收到该意图 如果您想绝对确保只有B可以接收到意图,那么您可以指定一个组件。请参阅:如果您这样做,则意味着A必须知道B内部的某个组件,才能引导意图,从而降低B更改该组件名称的灵活性。但这确实意味着A的意图只能转移到B
请注意,您仍然不应该信任B中的意图。另一个应用程序可以指定操作字符串(反编译您的应用程序,或通过查看logcat找到它)和B的组件,并通过发送恶意意图。因此,请务必检查B中的输入。我认为前面提供的三个答案都是正确的方法。目前,我正在使用我的代码的一个小修改。我需要使用setDataAndType,而不仅仅是setData。尽管应用程序B表示它可以处理任何mimeType,但没有在应用程序A中指定mimeType
PackageManager packageManager = getPackageManager();
ApplicationInfo appInfo = packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
String filePath = appInfo.dataDir + "/files/my.txt";
FileInputStream fis = new FileInputStream (new File (filePath));
// Please write the further code to read the contents of the file