SORU
15 AĞUSTOS 2013, PERŞEMBE


Nasıl destek FileProvider diğer uygulamalara içerik paylaşımı için kullanılacak?

Bir şekilde düzgün (AÇIK değil) harici Uygulama Android Destek kitaplığı FileProvider kullanarak bir iç dosya paylaşmak için sabırsızlanıyorum.

Doktorlar örnek aşağıdaki,

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.example.android.supportv4.my_files"
    android:grantUriPermissions="true"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/my_paths" />
</provider>

ve kullanarak aşağıdaki gibi diğer uygulamalar için bir dosya paylaşımı için ShareCompat

ShareCompat.IntentBuilder.from(activity)
.setStream(uri) // uri from FileProvider
.setType("text/html")
.getIntent()
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

çalışmıyor, beri FLAG_GRANT_READ_URİ_PERMİSSİON sadece hibe izni için Urı belirtilen data niyet, değer EXTRA_STREAM ekstra (gibi set setStream).

Sağlayıcı için true android:exported ayarlayarak güvenliğini tehlikeye atmak için denedim ama FileProvider eğer öyleyse, bir istisna atar, zaman verilen, kendisi ise DAHİLİ olarak kontrol eder.

CEVAP
20 AĞUSTOS 2013, Salı


Destek kitaplığı FileProvider kullanarak diğer uygulamalar için belirli Urı okumak için manuel ve izinleri(çalışma zamanında) grant. Context.grantUriPermission Context.revokeUriPermission yöntemleri kullanın.

Örneğin:

//grant permision for app with package "packegeName", eg. before starting other app via intent
context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);

//revoke permisions
context.revokeUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);

Eğer Paket ismi sağlayabilir mi son çare olarak, belirli bir niyet işleyebileceği tüm uygulamalar için izin verebilirsiniz:

//grant permisions for all apps that can handle given intent
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
...
List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
    String packageName = resolveInfo.activityInfo.packageName;
    context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}

Alternatif yöntem documentation göre:

  • SetData arayarak hedefindeki bir içerik URİ koyun().
  • Ardından, bu yöntemi Niyet arama.(). ya FLAG_GRANT_READ_URİ_PERMİSSİON veya FLAG_GRANT_WRİTE_URİ_PERMİSSİON ile ya da her ikisi.
  • Son olarak, başka bir uygulama için Niyet gönderin. Çoğu zaman, setResult çağırarak bunu().

    İzinleri bir Niyet verilen yığın süre etkili olur alıcı Etkinliği aktif. Yığın bitirir o zaman
    izinler otomatik olarak kaldırılır. İzinler verilmiş
    İstemci uygulama faaliyeti otomatik olarak diğer genişletilir
    bu uygulama bileşenleri.

Btw. eğer gerekiyorsa, *20 kopya* 15 *eğer verilen ise kontrol sağlayıcı önlemek için yöntem değiştirebilirsiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Alfredo Garcia

    Alfredo Garc

    25 Mayıs 2007
  • Andrea Lewis

    Andrea Lewis

    14 Mart 2013
  • boniver

    boniver

    17 NİSAN 2006