1

私はアプリ A と B を作成しています。A が任意の MIME タイプのファイル URI を B に送信できるようにしたいと考えています。B が要求せずに A から B に URI をプッシュしたい場合に、ファイルの要求を行う人を処理する方法の説明を見つけました。アプリ間でデータを共有する方法のより一般的な説明も見ましたが、それは ACTION_SEND を使用し、その場合、ユーザーには選択できるアプリのリストが表示されます。特にアプリ B だけがファイル URI を受け取るようにしたいのです。さらに、誰かが別の目的で ACTION_SEND を実行しているときに、アプリ 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>

私が得るエラーはActivityNotFoundExceptionです。setData 行を取り除くと、アクティビティが開始されますが、明らかに URI がありません。

ここでヒットしたその他の問題について読むことができます。

4

5 に答える 5

2

に を入れて、startActivity()B でアクティビティを呼び出します。を介してファイルを共有するためのレシピに従っていると仮定すると、 にフラグとして含めるだけで、B はファイルに一時的にアクセスできます。UriIntentFileProviderFLAG_ACTIVITY_GRANT_READ_PERMISSIONIntent

を介して PDF ファイルを共有しFileProvider、アクティビティで PDF ビューアを起動してその共有ファイルを表示するサンプル プロジェクトを次に示します。この場合、私のアプリは A、PDF ビューアー アプリは B です。

于 2014-08-15T16:55:19.990 に答える
1

他のアプリケーションが使用することを知っている一般的な ACTION_SEND を使用しないように、両方のアプリケーションで認識されているカスタム ACTION を使用します。これにより、ACTION_SEND に表示されたくないという問題が解決されます。また、カスタム アクションに登録するアプリケーションのみがそれを受信できることも意味します。欠点は、アクションに使用する文字列を知っている場合、他のアプリケーションがそのインテントを受け取る可能性があることです。

B だけがインテントを受信できることを確実にしたい場合は、コンポーネントを指定できます。参照: https://developer.android.com/reference/android/content/Intent.html#setComponent(android.content.ComponentName)これを行うと、インテントを指示するために A が B 内のコンポーネントを知る必要があることを意味しますに、そのコンポーネント名を変更するという点で B の柔軟性が低下します。ただし、A からのインテントは B にしか到達できないことを意味します。

B のインテントを信頼するべきではないことに注意してください。別のアプリケーションがアクション文字列 (アプリを逆コンパイルするか、logcat を監視して見つける) と B のコンポーネントを指定し、悪意のあるインテントを送信する可能性があります。したがって、常に B の入力を確認してください。

于 2014-08-15T17:11:37.807 に答える
0

古い投稿への返信で申し訳ありません。

以下のシナリオを与えることができます

1) 両方のアプリに同じ APPUSERID が必要です。

APP2 のワークフローが APP1 からデータを読み取りたい

1)APP1のインストール情報が必要です。(PackageManager を取得)

2) ApplicationInfo.getApplicationInfo を呼び出す (META-DATA を取得する)

手順

1) APP2 でアクセスしたいコンテンツを APP1 のファイルに保存します。

これはAPP1にあります

FileOutputStream fos = null
File file = null;
file = getFilesDir();
fos = openFileOutput("my.txt", Context.MODE_PRIVATE);
String text = "hello";
fos.write(text.getBytes());

APP2 で

String packageName = "your.package.name.of.app1";

2)次に、APP1に保存されたファイルを読み込みます

PackageManager packageManager = getPackageManager();

ApplicationInfo appInfo = packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA);

String filePath = appInfo.dataDir + "/files/my.txt";

3)次に、を使用してファイルを読み取ります

FileInputStream fis = new FileInputStream (new File (filePath));
// Please write the further code to read the contents of the file 

4) APP1 と APP2 の両方で同じユーザー ID を持っています。つまりpackag="x.y.z"、両方のアプリケーションで以下の行を書き込んだ後です。AndroidManifest.xml

android:sharedUserID = "a.b.c";// 両方のアプリのマニフェスト ファイルにこの行を必ず含めてください。ここで abc と xyz は生データです。

PS:例外を処理していません。

于 2015-04-24T07:17:45.873 に答える