2

Если я даю разрешение READ_EXTERNAL_STORAGE, все работает хорошо, но могу ли я заставить его работать, не спрашивая? Он работал без него на моем эмуляторе, но на реальном устройстве он не работает без него.Приложить pdf-письмо, предоставить разрешение

Выходной поток

String fileName = "Körjorunal_" + lastUpdateTime + ".PDF"; 
String path = Environment.getExternalStorageDirectory().toString(); 

File file = new File(path, fileName) 
pdfUri = Uri.fromFile(file); 

OutputStream outputStream = new FileOutputStream(file); 
document.writeTo(outputStream); 
document.close(); 
outputStream.close(); 

Намерение

// Gets invoked on setup, 
mShareIntent = new Intent(); 
mShareIntent.setAction(Intent.ACTION_SEND); 
mShareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
mShareIntent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 

// Creates document type. 
mShareIntent.setType("application/pdf"); 

// Going via email: 
mShareIntent.putExtra(Intent.EXTRA_SUBJECT, "Körjournal i bifogad PDF"); 

// Attach the PDf Uri. 
mShareIntent.putExtra(Intent.EXTRA_STREAM, pdfUri); 

mShareActionProvider.setShareIntent(mShareIntent); 

Manifest

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

ответ

1

FLAG_GRANT_*_URI_PERMISSION (для READ и WRITE) действительно для где Uri от вашей собственной ContentProvider. Если вы хотите, чтобы избежать необходимости разрешения WRITE_EXTERNAL_STORAGE (и лишняя READ_EXTERNAL_STORAGE):

Шаг # 1: записать файл internal storage, например getCacheDir()

Шаг № 2: Подавать этот файл с внутренней памяти, используя FileProvider

Шаг № 3: Используйте существующую ACTION_SEND логику, подставляя Uri, что вы получите от FileProvider

вы будете видеть, что модель используется в this sample project. Мой образец для ACTION_VIEW, а не ACTION_SEND, но в остальном это близкое совпадение.

Одно из ключевых различий, однако, будет в том, как вы предоставить разрешение, если ваш minSdkVersion ниже 21. Uri значения в статистах были проигнорированы FLAG_GRANT_*_URI_PERMISSION на Android 4.4 и ниже. Для этих версий единственным решением, которое я знаю, является предоставление прав на все возможные приложения (в вашем случае, каждый просмотрщик PDF).

В this sample app, я использую ACTION_IMAGE_CAPTURE, чтобы сделать снимок, и я использую FileProviderUri для этого (так как fileUri значения going away). Так же, как вы используете EXTRA_STREAM с Uri, я использую EXTRA_OUTPUT, поэтому я столкнулся с той же проблемой Uri -внешним разрешением.И, таким образом, я иду через весь этот беспорядок:

i.putExtra(MediaStore.EXTRA_OUTPUT, outputUri); 

    if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) { 
    i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
    } 
    else { 
    List<ResolveInfo> resInfoList= 
     getPackageManager() 
     .queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY); 

    for (ResolveInfo resolveInfo : resInfoList) { 
     String packageName = resolveInfo.activityInfo.packageName; 
     grantUriPermission(packageName, outputUri, 
     Intent.FLAG_GRANT_WRITE_URI_PERMISSION | 
      Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    } 
    } 

    startActivityForResult(i, CONTENT_REQUEST); 

(здесь, i это мой ACTION_IMAGE_CAPTUREIntent)

Итак, я жаловать ACTION_IMAGE_CAPTURE Intent the rights to work with this Uri` на Android 4.4 и старше.

+0

Спасибо, что я искал, мне нужно пройти через оба этих. –

0

Вы не можете использовать featur e без разрешения.

Если вы используете версию Android до Marshmallow, вы можете просто добавить разрешение на манифест, и оно не будет запрашивать его снова.

Но Marshmallow категоризировал разрешения на Normal and Dangerous permissions. Вы должны спросить об опасных разрешениях непосредственно перед тем, как пользователь использует эту функцию.

+0

Okey thanks, Если я попрошу разрешения, когда пользователь нажмет mShareActionProvider.setOnShareTargetSelectedListener, разрешение будет запрашиваться внутри shareprovider одновременно, как я могу остановить это, не спрашивая разрешения уже внутри onCreate()? –

+0

вы сначала запрашиваете разрешение, тогда, если и только если разрешение предоставлено, покажите поставщика акций. –

+0

Я имею в виду, можно ли добавить проверку прав, когда пользователь нажимает onCreateOptionsMenu(), а не раньше? –