Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在两个特定的android应用程序之间共享文件_Android_Android Sharing - Fatal编程技术网

在两个特定的android应用程序之间共享文件

在两个特定的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

我正在编写应用程序A和B。我希望A能够向B发送任何给定mime类型的文件URI。我发现了一个,更像是一个pull,当我想将URI从a推送到B时,B没有请求。我也看到了,但它使用ACTION_SEND,在这种情况下,用户将看到一个应用程序列表,供选择。我只希望应用程序B专门接收文件URI。此外,我不希望应用程序B在有人出于不同目的执行动作时显示为一种选择。那么,如何将文件URI从一个特定应用发送到另一个特定应用

编辑1:向示例中添加一些代码段

在应用程序A中,我正在执行以下操作:

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