Я пытаюсь создать и поделиться изображением диаграммы, построенной с помощью MPAndroidChart.
Я использую ShareIntent, и это метод onCreateOptionsMenu:
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate menu resource file
getMenuInflater().inflate(R.menu.share_menu, menu);
// Locate share item with ShareActionProvider
MenuItem shareItem = menu.findItem(R.id.item_share);
// Fetch and store ShareActionProvider
shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
Bitmap chartBitmap = chart.getChartBitmap();
File imagesDirectory = new File(getFilesDir(), "images");
if (!imagesDirectory.isDirectory() || !imagesDirectory.exists()) {
imagesDirectory.mkdir();
}
File bitmapFile = new File(imagesDirectory, chartName.concat(".jpeg"));
if (!bitmapFile.exists()) {
try {
bitmapFile.createNewFile();
} catch (IOException e){
e.printStackTrace();
}
}
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(bitmapFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Uri contentUri = FileProvider.getUriForFile(getBaseContext(), "com.mycompany", bitmapFile);
chartBitmap.compress(Bitmap.CompressFormat.JPEG, 20, outputStream);
Intent shareImageIntent = new Intent(Intent.ACTION_SEND);
shareImageIntent.setType("image/jpeg");
shareImageIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
shareImageIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
setShareIntent(shareImageIntent);
// Return true to display menu
return true;
}
Здесь я получаю растровое изображение из диаграммы, как рекомендовано в MPAndroidChart вики
getChartBitmap(): Returns the Bitmap object that represents the chart, this Bitmap always contains the latest drawing state of the chart.
Bitmap chartBitmap = chart.getChartBitmap();
Затем, как рекомендуется в документации Android, я использую FileProvider, чтобы поделиться изображением; вот где я объявляю это в AndroidManifest.xml:
<provider
android:authorities = "com.mycompany"
android:name = "android.support.v4.content.FileProvider"
android:exported = "false"
android:grantUriPermissions = "true">
<meta-data
android:name = "android.support.FILE_PROVIDER_PATHS"
android:resource = "@xml/images_path"/>
</provider>
И здесь я указываю каталоги, содержащие файлы, которыми мне нужно поделиться.
<paths xmlns:android = "http://schemas.android.com/apk/res/android">
<files-path name = "sharedImages" path = "images/"/>
</paths>
Это экран диаграммы, которой я хотел бы поделиться, но это - это изображение, которое фактически используется совместно.
Почему отсутствует линия на графике?
Я не знаю, но вы можете получить растровое изображение из диаграммы включения макета, Бывший:
view.setDrawingCacheEnabled(true)
view.buildDrawingCache()
Bitmap bm = view.getDrawingCache()
Я решил это! Это была отчасти моя ошибка, но в данном случае библиотека не идеальна.
Проблема заключалась в том, что я звонил getChartBitmap внутри onCreateOptionsMenu, который запускается, как только я перехожу к этому Деятельность.
MPAndroidChart позволяет добавить анимацию, которая медленно показывает график; пока я звонил getChartBitmap, анимация все еще продолжалась, поэтому я не мог видеть линию диаграммы, потому что она еще не была загружена.
Я отключил анимацию и теперь все работает нормально. Если кто-то знает, как получить изображение с линией диаграммы и сохранить анимацию, дайте мне знать.
вы можете добавить прослушиватель анимации и получить растровое изображение в методе OnAnimationEnd