Я пытаюсь преобразовать представление карты в изображение и поделиться им через приложение Whats. Я использую файловый провайдер, так как версия тестового устройства выше.
Поэтому, когда я пытаюсь создать файл, он дает мне исключение
e = {IllegalArgumentException@7727} "java.lang.IllegalArgumentException: Failed to find configured root that contains /com.example.onboardingversion2/images/card_image"
mCardFile = {File@7701} "com.example.onboardingversion2/images/card_image"
для кода:
public void createFile() {
FileOutputStream outputStream = null;
try {
File imagePath = new File(getActivity().getPackageName(), "images");
mCardFile = new File(imagePath, "card_image");
Uri contentUri = getUriForFile(getContext(), getActivity().getPackageName() + ".provider", mCardFile);
sendCard(contentUri);
} catch (Exception e) {
e.printStackTrace();
}
}
Когда я использовал приведенный ниже код с помощью getFilesDir(), он переходит только к намерению приложения, и при попытке поделиться изображение не отображается.
File imagePath = new File(getActivity().getFilesDir(), "images");
mCardFile = new File(imagePath, "card_image");
Uri contentUri = getUriForFile(getContext(), getActivity().getPackageName() + ".provider", mCardFile);
sendCard(contentUri);
XML-файл
<?xml version = "1.0" encoding = "utf-8"?>
<paths xmlns:android = "http://schemas.android.com/apk/res/android">
<files-path name = "my_images" path = "images/"/>
</paths>
Манифест
<provider
android:name = "androidx.core.content.FileProvider"
android:authorities = "${applicationId}.provider"
android:exported = "false"
android:grantUriPermissions = "true">
<meta-data
android:name = "android.support.FILE_PROVIDER_PATHS"
android:resource = "@xml/provider_paths" />
</provider>
Преобразование вида в растровое изображение
public Bitmap viewToBitmap(final View view) {
cardView.post(new Runnable() {
@Override
public void run() {
mBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(mBitmap);
view.draw(canvas);
createFile();
}
});
return mBitmap;
}
Поделиться кодом:
public void sendCard(Uri contentUri)
{
Intent whatsappIntent = new Intent(Intent.ACTION_SEND);
whatsappIntent.setType("text/plain");
whatsappIntent.setPackage("com.whatsapp");
whatsappIntent.putExtra(Intent.EXTRA_TEXT, "The text you wanted to share");
whatsappIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
whatsappIntent.setType("image/jpeg");
whatsappIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
try {
getActivity().startActivity(whatsappIntent);
} catch (android.content.ActivityNotFoundException ex) {
Utils.showDialog(getActivity(),"Whats App have not been installed.");
}
}
У меня есть представление карты, которое я пытаюсь создать в растровое изображение, преобразовать растровое изображение в файл изображения и поделиться им, используя намерение общего доступа.
Где я ошибаюсь? Представление не может быть преобразовано в изображение?
Пожалуйста помоги. Спасибо.
пожалуйста, проверьте отредактированный вопрос, добавлен XML-файл. @chrjs
Сначала добавьте разрешение
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>
использовать растровое изображение из res
Bitmap b =BitmapFactory.decodeResource(getResources(),R.drawable.userimage);
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/jpeg");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(getContentResolver(),
b, "Title", null);
Uri imageUri = Uri.parse(path);
share.putExtra(Intent.EXTRA_STREAM, imageUri);
startActivity(Intent.createChooser(share, "Select"));
Это сработало. :-) спасибо @Sonali, но будет ли это работать на всех устройствах?
Вот простой способ без лишних разрешений:
создайте папку xml в папке res (щелкните правой кнопкой мыши res -> new -> каталог ресурсов Android -> тип ресурса: xml).
создайте новый файл xml с именем file_paths.xml
вставьте этот код внутрь
file_paths.xml:
<?xml version = "1.0" encoding = "utf-8"?>
<paths xmlns:android = "http://schemas.android.com/apk/res/android">
<cache-path name = "Download" path = "." />
</paths>
В своем манифесте вставьте эту строку в приложение:
<provider
android:name = "android.support.v4.content.FileProvider"
android:authorities = "${applicationId}.my.package.name.provider"
android:exported = "false"
android:grantUriPermissions = "true">
<meta-data
android:name = "android.support.FILE_PROVIDER_PATHS"
android:resource = "@xml/file_paths" />
</provider>
В вашем классе:
public void sendViewViaMail(final View view, final Context baseContext, final Context activityContextOnly, final String textToMail) {
view.post(new Runnable() {
@Override
public void run() {
int heightG = view.getHeight();
int widthG = view.getWidth();
sendViewViaMail(view, baseContext, activityContextOnly, widthG, heightG, textToMail);
}
});
}
private void sendViewViaMail(View view, final Context baseContext, Context activityContextOnly, int widthG, int heightG, String textToMail) {
Bitmap bitmap = MyBitmapUtils.createViewBitmap(view, widthG, heightG);
Uri imageUri = null;
File file = null;
FileOutputStream fos1 = null;
try {
File folder = new File(activityContextOnly.getCacheDir() + File.separator + "My Temp Files");
boolean success = true;
if (!folder.exists()) {
success = folder.mkdir();
}
String filename = "img.jpg";
file = new File(folder.getPath(), filename);
fos1 = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos1);
imageUri = FileProvider.getUriForFile(activityContextOnly, activityContextOnly.getPackageName() + ".my.package.name.provider", file);
} catch (Exception ex) {
} finally {
try {
fos1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
final Intent emailIntent1 = new Intent(Intent.ACTION_SEND);
emailIntent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent1.putExtra(Intent.EXTRA_EMAIL, new String[]{});
emailIntent1.putExtra(Intent.EXTRA_STREAM, imageUri);
emailIntent1.putExtra(Intent.EXTRA_SUBJECT, "[" + "COMPANY_HEADER" + "]");
emailIntent1.putExtra(Intent.EXTRA_TEXT, textToMail);
emailIntent1.setData(Uri.parse("mailto:" + "[email protected]")); // or just "mailto:" for blank
emailIntent1.setType("image/jpg");
activityContextOnly.startActivity(Intent.createChooser(emailIntent1, "Send email using"));
}
public static Bitmap createViewBitmap(View view, int widthG, int heightG) {
Bitmap viewBitmap = Bitmap.createBitmap(widthG, heightG, Bitmap.Config.RGB_565);
Canvas viewCanvas = new Canvas(viewBitmap);
Drawable backgroundDrawable = view.getBackground();
if (backgroundDrawable!=null){
backgroundDrawable.draw(viewCanvas);
}
else{
viewCanvas.drawColor(Color.WHITE);
view.draw(viewCanvas);
}
return viewBitmap;
}
Как это назвать:
CardView myCard = (CardView) findViewById(R.id.myCard);
sendViewViaMail(myCard, getApplicationContext(), Activity_Cabinet.this, report);
что такое createViewBitmap()
createViewBitmap() добавлен к ответу
Пожалуйста, покажите ваш provider_paths xml. Это должно выглядеть примерно так: <external-path name = "mypath" path = "Android/data/PACKAGEID/files/Pictures" />