Подтвердить что ты не робот

Поделиться файлом изображения из каталога кеша через Intent ~ android

Я пытаюсь поделиться файлом изображения в каталоге кеша, у меня есть полный путь, но не могу отправить файл в вложениях, код

File shareImage=Utils.getBitmapFile();
Log.d("Activity", "get final path in result"+shareImage.getAbsolutePath());
/*MimeTypeMap mime = MimeTypeMap.getSingleton();
String ext=shareImage.getName().substring(shareImage.getName().lastIndexOf(".")+1);
String type = mime.getMimeTypeFromExtension(ext);
shareIntent.setType(type);
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/*");
Uri shareImageUri = Uri.fromFile(shareImage);
Uri shareImageUri = Uri.fromParts("content", shareImage.getAbsolutePath(), null);//("content://"+shareImage.getAbsolutePath()); 
*/


Uri shareImageUri = Uri.fromFile(shareImage);
Log.d("Result ","uri is "+shareImageUri.toString());
shareIntent.putExtra(Intent.EXTRA_STREAM, shareImageUri);
startActivity(Intent.createChooser(shareIntent, "Share Results"));

приведенный выше код не работает

отправленное письмо показывает вложение, но не получает конец, там нет вложения, facebook sharing также не показывает изображение в сообщении

в чем причина этого?

Я уже видел следующие ссылки SO как использовать-share-image-using-sharing-intent-to-share-images-in-android и многие другие, ни один из них не может решить проблему.

P.S.;

1. Цель состоит в том, чтобы сделать снимок экрана на экране, сохранить его в каталоге кеша и поделиться им онлайн оттуда

2. У меня есть файл, я могу вытащить его через DDMS с устройства и посмотреть в системе.

4b9b3361

Ответ 1

в чем причина этого?

Как уже отмечалось, другие приложения не имеют доступа к внутреннему хранилищу вашего приложения.

ни один из них не может решить проблему

Не стесняйтесь открыть новый вопрос StackOverflow, где вы объясните, полностью и точно, какие конкретные решения вы попытались и какие конкретные проблемы вы столкнулись.

но это, похоже, не работает как сообщение SO!!!

Не стесняйтесь открыть свежий вопрос StackOverflow, где вы объясните, полностью и точно, что означает "то, что не работает".

Или, использовать FileProvider, который предлагает эту возможность без кода, требуемого за пределами записи для него в манифесте.

Или сохраните изображение на внешнем хранилище, например getExternalCacheDir().

Ответ 2

Я следил за советом @CommonsWare и использовал FileProvider. Предполагая, что ваше изображение уже находится во внутреннем каталоге кэша как cache/images/image.png, вы можете использовать следующие шаги. Это, в основном, консолидация документации.

Настройте FileProvider в манифесте

<manifest>
    ...
    <application>
        ...
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.example.myapp.fileprovider"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>
        ...
    </application>
</manifest>

Замените com.example.myapp вашим именем пакета приложения.

Создать файл res/xml/filepaths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <cache-path name="shared_images" path="images/"/>
</paths>

Это сообщает FileProvider, куда следует делить файлы (используя в этом случае каталог кэша).

Поделитесь изображением

File imagePath = new File(context.getCacheDir(), "images");
File newFile = new File(imagePath, "image.png");
Uri contentUri = FileProvider.getUriForFile(context, "com.example.app.fileprovider", newFile);

if (contentUri != null) {

    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read this file
    shareIntent.setDataAndType(contentUri, getContentResolver().getType(contentUri));
    shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
    startActivity(Intent.createChooser(shareIntent, "Choose an app"));

}

Документация

Ответ 3

Я разделяю кэшированное изображение с помощью следующих шагов.

1. Скопируйте ваше кэшированное изображение в целевой путь.

public static File copyImage (String sourcePath, String targetPath) {
                try {
              InputStream in = new FileInputStream (sourcePath);
                                                            " байт [] buf = новый байт [1024];                           int len;
                             , в то время как ((len = in.read(buf)) > 0) {
                      out.write(buf, 0, len);
                       }
                            in.close();
              out.close();
              вернуть новый файл (targetPath);         } catch (IOException e) {
                            e.printStackTrace();
                                             }
       }

2. Получите Uri файла копии.

Uri uri = Uri.fromFile(target);

Изображение 3.Share по намерениям

    File dir = new File(Constant.INKPIC_PATH);//your custom path,such as /mnt/sdcard/Pictures
    if(!dir.exists()){
        dir.mkdirs();
    }
    File f = new File(dir,"temporary_file.jpg");
    File target = copyImage(url,f.getAbsolutePath());
    Uri uri = Uri.fromFile(target);
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_SEND);
    intent.setType("image/*");
    intent.putExtra(Intent.EXTRA_STREAM,uri );
    context.startActivity(intent);