2011-02-04 4 views
10

一部の機密データを保護するための要件が​​あります。データはURLからPDFとしてダウンロードし、次のコードを使用したアプリケーション専用ファイルとして保存されます。コンテンツプロバイダURIからのインテントを表示しますか?

public File downloadPDF(final Context fileContext, Uri reportUri, final String fileName) 
{ 
    try 
    { 
     HttpGet get = new HttpGet(reportUri.toString()); 

     File file = httpClient.execute(get, new ResponseHandler<File>() 
     { 
      @Override 
      public File handleResponse(HttpResponse response) throws ClientProtocolException, IOException 
      { 
       if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) 
       { 
        response.getEntity().writeTo(fileContext.openFileOutput(fileName, Context.MODE_WORLD_READABLE)); 
        return fileContext.getFileStreamPath(fileName); 
       } 
       return null; 
      } 
     }); 

     return file; 
    } 
    catch (IOException e) 
    { 
     Log.e(TAG, "Unable to download report.", e); 
    } 

    return null; 
} 

、私は何をしたいのですがContext.MODE_PRIVATEを使用してこれを変更してのContentProviderを作成することです私のアプリケーションでは、このファイルをAdobe ReaderなどのPDFリーダーと共有することを完全に制御できます。これは可能ですか?現在、次のようなコードを使用して、現在設定されているPDFリーダーにレポートURIを渡します。

// Fire up a PDF viewer intent for the URL. 
    Intent intent = new Intent(Intent.ACTION_VIEW); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    intent.setDataAndType(uri, "application/pdf"); 
    startActivity(intent); 

ContentProviderタイプのURIでも同じことができますか? content:// package/fileidタイプのURI?私は明日少しでもスパイクを試みて、できるかどうか見ていきますが、誰かがfile:// URIだけが許されていることを知っていれば、本当に役に立ちます。


UPDATE

私はオーバーライドされ、以下の方法でContentProviderのサブクラスを実装することで、十分に私の問題を解決することができました:

@Override 
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException 
{ 
    // The filename is the path in the URI without the initial slash. 
    String fileName = uri.getPath().substring(1); 
    File file = getContext().getFileStreamPath(fileName); 
    return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); 
} 

その後、私は見意図をオフに解雇する場合、それは次のように書き直されます:

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
Uri uri = Uri.withAppendedPath(Uri.parse("content://providername/"),filePath); 
intent.setData(uri); 
startActivity(intent); 

私の場合は、content:// URIからの読み込みを適切に実装しているAdobe Readerを使用しています。

答えて

4

同じことがContentProviderタイプのURIを通じて機能しますか? content:// package/fileidタイプのURI?

です。 getType()にはContentProviderの返品application/pdfが必要です。また、一部のPDFリーダーでcontent://Uriの値を処理できない可能性があります。あなたは何ができるか

は、何がcontent://Uri上ごACTION_VIEWIntentを理解するかどうかを確認するためにPackageManagerを使用し、ContentProviderを作るです。何かが応答すると、あなたは設定されています。そうでない場合は、ファイルを世界中で読み取り可能にして、現在の実装を使用することに戻すことができます。または、ファイルを世界中で読めるように変更することは苦しいかもしれませんので、あなたのContentProviderがサポートしているスクラップUriを使用して早期にテストを実行することができます。あなたのダウンロード。

+0

ありがとうございます。私は自分の午前中にコンセプトの実証に取り組み、私がよく使うPDFリーダーが 'content://' URIを受け入れるかどうかを調べるつもりです。私はこの 'PackageManager'の使い方について知らなかったので、私はそれについて読むことができます。 – Thorinside

+1

はい、それは起こっているようです。私はAdobe Readerの 'ソース'を見て、VIEW content:// Intentの場合にコンテンツリゾルバを使用するかどうかを確認し、実際にはそうなるように見えます。私は今なぜ私のContentProviderが呼び出されていないのか把握しようとしています。 – Thorinside

+0

さて、私は、Adobe Readerの入力ストリーム要求を代行受信するために、ContentProviderインスタンスのopenFileメソッドをオーバーライドする必要があることを知りました。私は励まされる。 – Thorinside

1

んが、コンテンツプロバイダが保護していないしていないファイル実際に

はおそらくアプリがコンテンツプロバイダからのファイルとするかもしれない最初の事は、そのキャッシュディレクトリ内の一時的なコピーを作成しています。私はあなたがこれを再訪すべきだと思います。

関連する問題