Intent.ACTION_SEND не работает над Oreo

Я разрабатываю приложение для пользовательских камер, которое фиксирует изображение и сохраняет его в галерее. Когда я обмениваюсь этим изображением с помощью Intent.ACTION_SEND, он отлично работает на всех устройствах, кроме устройств с API 26, то есть OREO.

Мой код для совместного использования изображения:

Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.setType("image/jpeg"); Uri uriShare = Uri.fromFile(outFile); //outfile is the path of the image stored in the gallery shareIntent.putExtra(Intent.EXTRA_STREAM, uriShare); startActivity(Intent.createChooser(shareIntent, "")); 

Может ли кто-нибудь помочь мне решить эту проблему?

Если targetSdkVersion больше 24 , то FileProvider используется для предоставления доступа.

Создайте XML-файл (путь: res \ xml) provider_paths.xml

     

Добавить поставщика в AndroidManifest.xml

     

и заменить

 Uri uri = Uri.fromFile(fileImagePath); 

в

 Uri uri = FileProvider.getUriForFile(MainActivity.this, BuildConfig.APPLICATION_ID + ".provider",fileImagePath); 

и вы закончили Спасибо.

Используйте File Provider для получения URI IMAGE и добавьте флаги в намерение … внимательно следуйте этим шагам .. android.os.FileUriExposedException: file: ///storage/emulated/0/test.txt выставляется вне приложения через Intent.getData ( ) Это обновление было сделано с нуга ..

Больше подробностей

Прочитай это

https://developer.android.com/reference/android/support/v4/content/FileProvider.html

Исходный код

https://drive.google.com/open?id=1vfO43dMSt096CMp6nrOJNl3fJAf6MPwG

 create xml folder inside providers_path.xml                              package com.holostik.sharescreenshotexample; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v4.content.FileProvider; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; import com.holostik.sharescreenshotexample.share.ScreenshotType; import com.holostik.sharescreenshotexample.share.ScreenshotUtils; import java.io.File; import java.io.FileOutputStream; import java.util.Random; public class MainActivity extends AppCompatActivity { int n; String photoPath; LinearLayout rootContent; ImageView iv_share; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rootContent = (LinearLayout) findViewById(R.id.rootContent); iv_share = (ImageView) findViewById(R.id.iv_share); iv_share.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA); if (permissionCheck == PackageManager.PERMISSION_GRANTED) { Log.e("MainActivity ", "P granted"); takeScreenshot(ScreenshotType.FULL); } else { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }, 1); } } else { Log.e("MainActivity", "Lower Than MarshMallow"); takeScreenshot(ScreenshotType.FULL); } } }); } /* Method which will take screenshot on Basis of Screenshot Type ENUM */ private void takeScreenshot(ScreenshotType screenshotType) { Bitmap b = null; switch (screenshotType) { case FULL: b = ScreenshotUtils.getScreenShot(rootContent); break; case CUSTOM: //If Screenshot type is CUSTOM break; } //If bitmap is not null if (b != null) { // showScreenShotImage(b);//show bitmap over imageview Log.e("keshav", "bitmap is -- > " + b); SaveImage(b); shareScreenshot(); /* File saveFile = ScreenshotUtils.getMainDirectoryName(MainActivity.this);//get the path to save screenshot File file = ScreenshotUtils.store(b, "screenshot" + screenshotType + ".jpg", saveFile);//save the screenshot to selected path shareScreenshot(file);//finally share screenshot Log.e("file Path", String.valueOf(file)); */ } else //If bitmap is null show toast message Toast.makeText(MainActivity.this, R.string.screenshot_take_failed, Toast.LENGTH_SHORT).show(); } private void SaveImage(Bitmap finalBitmap) { String root = Environment.getExternalStorageDirectory().toString(); File myDir = new File(root + "/saved_images"); myDir.mkdirs(); Random generator = new Random(); n = 10000; n = generator.nextInt(n); String fname = "Image-" + n + ".jpg"; File file = new File(myDir, fname); if (file.exists()) file.delete(); try { FileOutputStream out = new FileOutputStream(file); finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } /* TODO Show screenshot Bitmap */ // private void showScreenShotImage(Bitmap b) { // imageView.setImageBitmap(b); // } private void shareScreenshot() { photoPath = Environment.getExternalStorageDirectory() + "/saved_images" + "/Image-" + n + ".jpg"; File F = new File(photoPath); //Uri U = Uri.fromFile(F); // Uri U = FileProvider.getUriForFile(getActivity(), getActivity().getApplicationContext().getPackageName() + ".my.package.name.provider", F); // TODO your package name as well add .fileprovider Uri U = FileProvider.getUriForFile(MainActivity.this.getApplicationContext(), "com.holostik.sharescreenshotexample.fileprovider", F); Intent i = new Intent(Intent.ACTION_SEND); i.setType("image/png"); i.putExtra(Intent.EXTRA_STREAM, U); startActivityForResult(Intent.createChooser(i, "Email:"), 1); } // TODO Share Screen SHOT End .............. }