Android 11'deActivityForResult nasıl başlatılır?

Oct 15 2020

startActivityForResult()Şunun gibi bir şey yaparak uygulamama resim yüklüyorum :

val intentForLoadingImage = Intent(Intent.ACTION_GET_CONTENT)
intentForLoadingImage.type = "image/*"
if (intentForLoadingImage.resolveActivity(packageManager) != null) {
    startActivityForResult(intentForLoadingImage, IMAGE_REQUEST_CODE)
}

onActivityResult()Görüntüyü bir ImageView'a yükleme mantığımı geçersiz kıldım. Tüm android sürümlerinde çalışır (uygulamamın minSdkVersion'ı 21'dir) ancak Android 11'de kesinlikle hiçbir şey yapmaz. Çünkü intentForLoadingImage.resolveActivity(packageManager)boş döndürür ve resim yükleme etkinliği başlamaz.

Yanıtlar

1 ianhanniballake Oct 15 2020 at 05:46

Gereğince ACTION_GET_CONTENTbelgeleri , gerçek bir dize olduğunu android.intent.action.GET_CONTENTve değil android.media.action.GET_CONTENT kodunuzda olması. Bu nedenle, doğru paket görünürlüğü sorgusu

<queries>
    <intent>
        <action android:name="android.intent.action.GET_CONTENT" />
        <data android:mimeType="image/*"/>
    </intent>
</queries>

Alternatif olarak, özel bir ROM'un parçası olarak Depolama Erişim Çerçevesinin (hangi işleyicileri ) devre dışı bırakıldığı ActivityNotFoundExceptionnadir durumlarda meydana gelenleri de yakalayabilirsiniz . Bu yaklaşım, paket görünürlük etiketi gerektirmez:ACTION_GET_CONTENT

val intentForLoadingImage = Intent(Intent.ACTION_GET_CONTENT)
intentForLoadingImage.type = "image/*"
try {
    startActivityForResult(intentForLoadingImage, IMAGE_REQUEST_CODE)
} catch (e: ActivityNotFoundException) {
}
1 AbhishekChoudhary Oct 18 2020 at 07:13

Android 11'de paket görünürlüğü gizlilik güncellemelerini öğrendim . Hangi diyor

Android 11, uygulamaların, kullanıcının bir cihaza yüklediği diğer uygulamaları sorgulama ve bunlarla etkileşim kurma şeklini değiştirir. Öğeyi kullanarak uygulamalar, erişebilecekleri diğer paketler kümesini tanımlayabilir. Bu öğe, sisteme hangi diğer paketlerin uygulamanıza görünür hale getirileceğini söyleyerek en az ayrıcalık ilkesini teşvik etmeye yardımcı olur ve Google Play gibi uygulama mağazalarının, uygulamanızın kullanıcılar için sağladığı gizliliği ve güvenliği değerlendirmesine yardımcı olur.

Uygulamanız Android 11 veya sonraki bir sürümünü hedefliyorsa, öğeyi uygulamanızın manifest dosyasına eklemeniz gerekebilir. Öğe içinde paketleri ada göre, niyet imzasına göre veya sağlayıcı yetkisine göre belirtebilirsiniz.

Bu yüzden, manifest dosyama aşağıdaki etiketleri ekledim:

<queries>
    <intent>
        <action android:name="android.intent.action.GET_CONTENT" />
        <data android:mimeType="image/*"/>
    </intent>
</queries>

Ve bu kadar!