2014-06-28 4 views
1

Я пытался и пытался заставить это работать. Я прошел множество примеров без везения. Проблема в том, что изображение не подключено, когда я пытаюсь его использовать, например, используя почтовый клиент. Мне удалось заставить это работать при использовании внешнего хранилища, но внутреннее хранилище лучше подходит для моих нужд.Обмен изображения из внутреннего хранилища

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

Это из Activity класса:

int width    = size.x; 
int height    = size.y; 
Bitmap shareBmp  = Bitmap.createBitmap(screenBmp, 0, 0, width, height); 
ContextWrapper wrapper = new ContextWrapper(getApplicationContext()); 
File directory   = wrapper.getDir("images", Context.MODE_PRIVATE); 
File filePath   = new File(directory, "share.png"); 

FileOutputStream fos; 

try 
{ 
    fos = new FileOutputStream(filePath); 
    shareBmp.compress(Bitmap.CompressFormat.PNG, 90, fos); 
    fos.close(); 
} 
catch (Exception aE){} 

Uri uri  = Uri.parse("content://com.example.Test/share.png"); 
Intent intent = new Intent(); 

intent.setAction(Intent.ACTION_SEND); 
intent.putExtra(Intent.EXTRA_STREAM, uri); 
intent.setType("image/png"); 
startActivity(Intent.createChooser(intent, "Share Image")); 

Вот ImageProvider класс:

public class ImageProvider extends ContentProvider 
{ 
    @Override 
    public ParcelFileDescriptor openFile(Uri aUri, String aMode) throwsFileNotFoundException 
    { 
     File file = new File(getContext().getFilesDir(), aUri.getPath()); 

     if (file.exists()) 
     { 
      return (ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)); 
     } 

     throw new FileNotFoundException(aUri.getPath()); 
    } 

    @Override 
    public boolean onCreate() 
    { 
     return false; 
    } 

    @Override 
    public int delete(Uri aUri, String aSelection, String[] aSelectionArgs) 
    { 
     return 0; 
    } 

    @Override 
    public String getType(Uri aUri) 
    { 
     return null; 
    } 

    @Override 
    public Uri insert(Uri aUri, ContentValues aValues) 
    { 
     return null; 
    } 

    @Override 
    public Cursor query(Uri aUri, String[] aProjection, String aSelection, String[] aSelectionArgs, String aSortOrder) 
    { 
     return null; 
    } 

    @Override 
    public int update(Uri aUri, ContentValues aValues, String aSelection, String[] aSelectionArgs) 
    { 
     return 0; 
    } 
} 

Это из манифеста:

<provider 
     android:name=".ImageProvider" 
     android:authorities="com.example.Test" 
     android:exported="true"/> 
+0

см. Мой ответ здесь: http://stackoverflow.com/questions/15377373/how-to-put-a-video-file-in-android-custom-content-provider – dangalg

ответ

0

Только ваше приложение может увидеть/прочитать/писать файлы в своем приложении -private-storage. Таким образом, вы не можете просить другое приложение делиться от него, так как они даже не могут «видеть» эти файлы там.

+0

Но это не поставщик контента, просто что использовать в этой ситуации? Из руководства разработчика: «Вам не нужно разрабатывать собственный провайдер, если вы не собираетесь делиться своими данными с другими приложениями». – Deeds

+0

Вы правы. Я не видел, чтобы ты его использовал. Извините за то, что так быстро. Теперь мне нужно снова посмотреть ... Вы сказали, что сохраняете во внутренней памяти. Но что такое 'filePath.getAbsolutePath()'? – greenapps

+1

И сравните этот путь с 'file.getAbsolutePath()'. – greenapps