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文件(Path:res \ xml) provider_paths.xml

     

在AndroidManifest.xml中添加提供程序

     

替换

 Uri uri = Uri.fromFile(fileImagePath); 

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

你完成了谢谢。

使用文件提供程序获取IMAGE URI并为intent添加标志…请仔细执行以下步骤:android.os.FileUriExposedException:file:///storage/emulated/0/test.txt通过Intent.getData暴露在app之外( )这个更新已经从牛轧糖…

更多细节

读这个

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 .............. }