android обмениваются изображениями из папки с ресурсами

Я пытаюсь передать изображение из моей папки с ресурсами. Мой код:

Intent share = new Intent(Intent.ACTION_SEND); share.setType("image/jpg"); share.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///assets/myImage.jpg")); startActivity(Intent.createChooser(share, "Share This Image")); 

но это не сработает. У тебя есть идеи?

Можно передавать файлы (изображения в том числе) из папки с ресурсами через пользовательский ContentProvider

Вам необходимо расширить ContentProvider , зарегистрировать его в манифесте и реализовать метод openAssetFile . Затем вы можете оценить активы через Uri s

  @Override public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException { AssetManager am = getContext().getAssets(); String file_name = uri.getLastPathSegment(); if(file_name == null) throw new FileNotFoundException(); AssetFileDescriptor afd = null; try { afd = am.openFd(file_name); } catch (IOException e) { e.printStackTrace(); } return afd; } 

В дополнение к тому, что ответил @intrepidis :

Вам понадобятся методы переопределения, например, class classа:

 package com.android.example; import android.content.ContentProvider; import android.net.Uri; import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; import java.io.FileNotFoundException; import android.content.ContentValues; import android.database.Cursor; import java.io.IOException; import android.os.CancellationSignal; public class AssetsProvider extends ContentProvider { @Override public AssetFileDescriptor openAssetFile( Uri uri, String mode ) throws FileNotFoundException { Log.v( TAG, "AssetsGetter: Open asset file" ); AssetManager am = getContext( ).getAssets( ); String file_name = uri.getLastPathSegment( ); if( file_name == null ) throw new FileNotFoundException( ); AssetFileDescriptor afd = null; try { afd = am.openFd( file_name ); } catch(IOException e) { e.printStackTrace( ); } return afd;//super.openAssetFile(uri, mode); } @Override public String getType( Uri p1 ) { // TODO: Implement this method return null; } @Override public int delete( Uri p1, String p2, String[] p3 ) { // TODO: Implement this method return 0; } @Override public Cursor query( Uri p1, String[] p2, String p3, String[] p4, String p5 ) { // TODO: Implement this method return null; } @Override public Cursor query( Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal ) { // TODO: Implement this method return super.query( uri, projection, selection, selectionArgs, sortOrder, cancellationSignal ); } @Override public Uri insert( Uri p1, ContentValues p2 ) { // TODO: Implement this method return null; } @Override public boolean onCreate( ) { // TODO: Implement this method return false; } @Override public int update( Uri p1, ContentValues p2, String p3, String[] p4 ) { // TODO: Implement this method return 0; } } 

Мне нужно было переопределить два метода запроса. И добавьте эти строки над тегом в ваш androidmanifest.xml:

  

И с этим все работает как шарм: D

Этот блог объясняет все это:
http://nowherenearithaca.blogspot.co.uk/2012/03/too-easy-using-contentprovider-to-send.html

В основном это проявляется в манифесте:

  

Класс контент-провайдера имеет следующее:

 @Override public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException { AssetManager am = getContext().getAssets(); String file_name = uri.getLastPathSegment(); if(file_name == null) throw new FileNotFoundException(); AssetFileDescriptor afd = null; try { afd = am.openFd(file_name); } catch (IOException e) { e.printStackTrace(); } return afd;//super.openAssetFile(uri, mode); } 

И вызывающий код делает это:

 Uri theUri = Uri.parse("content://com.yourdomain.whatever/someFileInAssetsFolder"); Intent theIntent = new Intent(Intent.ACTION_SEND); theIntent.setType("image/*"); theIntent.putExtra(Intent.EXTRA_STREAM,theUri); theIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,"Subject for message"); theIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Body for message"); startActivity(theIntent); 

Для многих приложений требуется указать имя и размер изображения. Итак, вот улучшенный код (например, с использованием кода FileProvider от Google):

 public class AssetsProvider extends ContentProvider { private final static String LOG_TAG = AssetsProvider.class.getName(); private static final String[] COLUMNS = { OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE }; @Override public boolean onCreate() { return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { /** * Source: {@link FileProvider#query(Uri, String[], String, String[], String)} . */ if (projection == null) { projection = COLUMNS; } final AssetManager am = getContext().getAssets(); final String path = getRelativePath(uri); long fileSize = 0; try { final AssetFileDescriptor afd = am.openFd(path); fileSize = afd.getLength(); afd.close(); } catch(IOException e) { Log.e(LOG_TAG, "Can't open asset file", e); } final String[] cols = new String[projection.length]; final Object[] values = new Object[projection.length]; int i = 0; for (String col : projection) { if (OpenableColumns.DISPLAY_NAME.equals(col)) { cols[i] = OpenableColumns.DISPLAY_NAME; values[i++] = uri.getLastPathSegment(); } else if (OpenableColumns.SIZE.equals(col)) { cols[i] = OpenableColumns.SIZE; values[i++] = fileSize; } } final MatrixCursor cursor = new MatrixCursor(cols, 1); cursor.addRow(values); return cursor; } @Override public String getType(Uri uri) { /** * Source: {@link FileProvider#getType(Uri)} . */ final String file_name = uri.getLastPathSegment(); final int lastDot = file_name.lastIndexOf('.'); if (lastDot >= 0) { final String extension = file_name.substring(lastDot + 1); final String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); if (mime != null) { return mime; } } return "application/octet-stream"; } @Override public Uri insert(Uri uri, ContentValues values) { return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; } @Override public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException { final AssetManager am = getContext().getAssets(); final String path = getRelativePath(uri); if(path == null) { throw new FileNotFoundException(); } AssetFileDescriptor afd = null; try { afd = am.openFd(path); } catch(IOException e) { Log.e(LOG_TAG, "Can't open asset file", e); } return afd; } private String getRelativePath(Uri uri) { String path = uri.getPath(); if (path.charAt(0) == '/') { path = path.substring(1); } return path; } } 

AFAIK, нет способа поделиться изображением из папки с assets . Но можно обмениваться ресурсами из папки res .

Чтобы поделиться с папкой с ресурсами, я могу только рекомендовать библиотеку cwac-provider (StreamProvider).

Из-за того, что вы не разрабатываете собственный контент-провайдер, он добавляет некоторую поддержку капризным устаревшим приложениям (проверьте USE_LEGACY_CURSOR_WRAPPER ).

Interesting Posts

Спящий режим / постоянство без @Id

Как переместить / переименовать файл из внутреннего хранилища приложений во внешнее хранилище на Android?

Windows: Какое программное обеспечение вы рекомендуете для редактирования тэгов MP3 ID3?

Windows 7 Поиск части имени файла

css width: calc (100% -100px); альтернатива с использованием jquery

Показывать% вместо графов в диаграммах категориальных переменных

Перемещение курсора мыши из виртуальной машины останавливает ввод клавиатуры в этой виртуальной машине

широковещательный приемник для пропущенного вызова в android

Windows 10 VPN Connect Button Громоздкий

Преобразовать массив байтов в целое число на Java и наоборот

Как использовать событие EditText onTextChanged, когда я нажимаю номер?

Угловой 2 – внутренний стиль HTML

C # winforms combobox динамический автозаполнение

Есть ли команда «sudo» для Windows?

Двухканальная ОЗУ по сравнению с четырехканальным ОЗУ

Давайте будем гением компьютера.