2015-09-14 15 views
7

SD karttaki bazı dosyalara erişmek için Android Depolama Erişim Çerçevesini kullanıyorum. Cihazın yeniden başlatılmasından sonra dosyaları düzenleyebilmem için bu izinleri sürdürmem gerekiyor.Depolama Erişim Çerçevesi çalışma izinleri çalışmıyor

Storage Access Framework documentation uyarınca, aygıt yeniden başlatılmış olsa bile, kullanıcının uygulamanızla dosyalara sürekli erişmesini sağlayan Persist izinleri kullanıyorum. Ancak, bir süre sonra bazı kullanıcılar için izinlerin bir şekilde iptal edildiğini fark ettim. Çünkü yazım için SAF kullanmaya çalıştığımda android.system.ErrnoException: open failed: EACCES (Permission denied) aldığımdan sonra mContext.getContentResolver().getPersistedUriPermissions()'u kullanarak hangi izinleri kullandığımı kontrol ediyorum, ancak boş bir liste döndürüyor. Eminim ki, kullanıcı bana bu izinleri veritabanında izlediğim için, şu anda yüklü Sd kart için izinleri ve izinleri bana sağladığından eminim.

Şu anda, bu durumda, kullanıcı bir kez daha yeni izinlerle bana sağlayabilir, ancak kullanıcının aynı eylemi gerçekleştirmesini istemek sık sık kullanıcı dostu olmadığından belge seçici gösteriyorum.

İzinlerin iptal edilmesine ne sebep olabilir? Ve bunu nasıl önleyebilirim?

Tüm aygıtlarımda telefonun birden çok yeniden başlatılmasını test ettim, zamanı değiştirdim, SD kartını takmayı kaldırarak, ancak herhangi bir güvenli izin kaybettim. ACTION_OPEN_DOCUMENT_TREE isterken Ek bayrakları ihtiyaç

private void openDocumentTree() { 
     Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); 
     intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
     startActivityForResult(intent, REQUEST_CODE); 
    } 

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE) { 
      Uri treeUri = data.getData(); 
      final int takeFlags = data.getFlags() & ( 
        Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
      mContext.getContentResolver().takePersistableUriPermission(treeUri, 
        takeFlags); 

        //this is my internal class for saving and restoring tree uri permissions. 
        final Permission permission = Permission.from(treeUri); 
        mPermissionDao.save(permission); 
     } 
    } 
+1

gibi görünmelidir "Ben Android Depolama Erişim Çerçeve SD karttaki bazı dosyalara erişmek için kullandıkları" - hayır, çalışmak için SAF kullanıyor belgeler. Bu belgelerin saklanıp saklanmadığı kullanıcı değil, size aittir. Herhangi bir sağlayıcı tarafından yönetilebilir (Google Drive, Dropbox, vb.). "Kullanıcının bana doğru izinleri sağladığından ve bu izinlerin şu anda kurulu Sd kart için olduğundan eminim, çünkü bu eylemleri veritabanında izliyorum" - kullanıcının seçtiği belgeler bir SD kartta olmak zorunda değildir. "İzinlerin iptal edilmesine ne sebep olabilir?" - belki de kullanıcı dosyayı sağlayıcıdan silmiş. – CommonsWare

+0

Sadece SD kartlardaki dosyalarla çalışmak için Saf kullanıyorum, uygulamadan dolayı, harici depolama sağlayıcısıyla çalışmak için tek neden var. Ağacı uri'nin harici depolama biçiminde olduğunu kontrol ediyorum. –

+0

Belki de kullanıcı dosyayı sağlayıcıdan silmiş - mümkün değil, çünkü dış depolama alanının kök yolunu temsil eden ağacı aldım. Silmenin hiçbir yolu yok. Ayrıca, bahsettiğim gibi, yeni dosyalar oluşturamadım ('android.system.ErrnoException' atıyordu) ve getContentResolver(). GetPersistedUriPermissions() 'boş liste döndürdü. Bu nedenle kullanıcı bir şekilde izinleri iptal etti. –

cevap

1

:

ben elde izinleri için bir sonraki kod var.

openDocumentTree

private void openDocumentTree() { 
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); 
    intent.addFlags(
     Intent.FLAG_GRANT_READ_URI_PERMISSION 
     | Intent.FLAG_GRANT_WRITE_URI_PERMISSION 
     | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION 
     | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION); 
    startActivityForResult(intent, REQUEST_CODE); 
} 

İnceleme FLAG_GRANT_PERSISTABLE_URI_PERMISSION için dokümanlar ve FLAG_GRANT_PREFIX_URI_PERMISSION

İlgili konular