2011-02-04 21 views
10

Bazı hassas verileri korumak için bazı gereksinimlerim var. verileri bir URL'den PDF olarak indirilen ve aşağıdaki kodu kullanarak bir Uygulama Özel dosya olarak kaydedilir: Artıkİçerik Sağlayıcı URI'sinin amacı nedir?

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; 
} 

, ne yapmak istiyorum Context.MODE_PRIVATE kullanarak bu değiştirmek ve ContentProvider oluşturmaktır Uygulamamın bu dosyanın Adobe Reader gibi bir PDF okuyucuya paylaşılması üzerinde tam kontrol sahibi olması. Mümkün mü? Şu anda rapor URI'sını şu anda yapılandırılmış PDF okuyucuya geçirmek için aşağıdaki gibi kod kullanıyorum.

// 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); 

misiniz aynı bir ContentProvider türü URI aracılığıyla çalışacak mı? Bir içerik: // paket/dosya türü URI? Gelip yapamayacağımı görmek için biraz yarın başlayacağım, ama eğer herkesin sadece dosya: // URI'lere izin verildiğini biliyorsanız, bu gerçekten yardımcı olacaktır. ,

@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); 
} 

Sonra ben inceleyen niyet ateşlemesi:


GÜNCELLEME

Ben geçersiz aşağıdaki yöntemi ile bir ContentProvider alt sınıfı uygulayarak biçimde sorunu çözmek başardı Aşağıdaki gibi bir şey yeniden yazılır:

Ve benim durumumda, content:// URI'leri yüklemeyi düzgün bir şekilde uygulayan Adobe Reader kullanıyorum.

cevap

4

Aynı iş bir ContentProvider tipi URI aracılığıyla da çalışır mı? Bir içerik: // paket/dosya türü URI? Gelmeli

. getType() için ContentProviderapplication/pdf numaralı ürününüze sahip olmanız gerekir. Ayrıca, bazı PDF okuyucularının content://Uri değerlerini işleyememesi mümkündür.

Ne yapabilirsiniz şey anlayacaksınız olmadığını görmek için PackageManager kullanmak, sonra ContentProvider yapmak aşağıdadır content://Uri üzerinde ACTION_VIEWIntent. Eğer bir şey cevap verirse, siz ayarlanırsınız. Değilse, dosyayı dünya çapında okunabilir hale getirmek ve mevcut uygulamanızı kullanmak için geri dönebilirsiniz. Ya da, dosyayı dünya çapında okunabilir hale getirmek acı verici olabileceğinden, testi erken (örneğin uygulamanız başladığı zaman) Uri no'lu hurda ile ContentProvider desteklerinizi çalıştırabilir, böylece ne zaman yapacağınızı bileceksiniz. indirmelerin.

+0

Çok teşekkürler. Sabahları, genellikle kullandığım PDF okuyucuları tarafından 'content: // URI'ların kabul edilip edilmediğini görmek için bir konsept kanıtı üzerinde çalışmayı planlıyorum. 'PackageManager'ın bu kullanımını bilmiyordum, bu yüzden bu konu hakkında bir şeyler okuyacağım. – Thorinside

+1

Evet, öyle görünüyor.Adobe Reader için 'Source' kaynağında, bir “VIEW content: // Intent” olması durumunda bir İçerik Çözümleyici kullanıp kullanamayacağına baktım ve aslında öyle görünüyor. Şimdi ContentProvider'ın neden geri çağrılmadığını anlamaya çalışıyorum. – Thorinside

+0

Tamam, Adobe Reader'ın giriş akışı isteğini engellemek için ContentProvider örneğindeki openFile yöntemini geçersiz kılmam gerektiğini anladım. Ben teşvik edildim. – Thorinside

1

Hiçbir içerik sağlayıcıları korumak değildir dosyalar Aslında

muhtemelen uygulama bir içerik sağlayıcısından bir dosyayla yapabilir ilk şey onun önbellek dir geçici kopyasını yapmak olduğunu. Bunu tekrar gözden geçirmelisin.