Экспорт изображения через ContentProvider - PullRequest
2 голосов
/ 08 декабря 2010

Я пытаюсь экспортировать изображение из своего приложения в другие приложения, такие как Twitter, Facebook или другие приложения, принимающие изображения. Я делаю следующее:


private void exportImage()
{
    storeBitmapOnDisk(this.bitmap);
    Intent i = new Intent(Intent.ACTION_SEND);
    i.addCategory(Intent.CATEGORY_LAUNCHER);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
    | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
    File imgFile = context.getFileStreamPath("export.png");
    Uri uri = Uri.fromFile(imgFile);
    i.putExtra(Intent.EXTRA_STREAM, uri);
    i.setType("image/png");
    i.setComponent(componentName);
    context.startActivity(i);
}
private void storeBitmapOnDisk(Bitmap bitmap)
{
    try
    {
        FileOutputStream outStream = context.openFileOutput("export.png",
        Context.MODE_WORLD_READABLE);
        bitmap.compress(Bitmap.CompressFormat.PNG, 50, outStream);
        outStream.close();
    }
    catch (IOException e)
    {
        Log.d(TAG, e.getMessage());
    }
}

Это не работает, потому что я пишу внутреннее хранилище, недоступное другим приложениям. Поскольку я не хочу использовать внешнее хранилище (SD-карту), я думаю, что мне нужен ContentProvider, но все примеры, которые я видел, касаются пользовательских ContentPovider, использующих базу данных SQlite для хранения данных. Я не могу понять, как я могу сохранить растровое изображение во внутреннем хранилище и сделать его доступным через ContentProvider для других приложений, не сохраняя свое растровое изображение в базе данных. MatrixCursor, похоже, тоже не адаптирован ...

РЕШЕНИЕ Я создаю пользовательский поставщик содержимого и задаю путь к файлу в поставщике содержимого в качестве дополнительного параметра Uri EXTRA_STREAM для намерения:

Сначала мой класс провайдера, где мне нужно было только переопределить openFile , что не ясно в документе ...


public class ExportContentProvider extends ContentProvider
{
  public static Uri CONTENT_URI = Uri
                                    .parse("content://com.path.to.my.provider");

  @Override
  public int delete(Uri uri, String selection, String[] selectionArgs)
  {
    return 0;
  }

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

  @Override
  public Uri insert(Uri uri, ContentValues values)
  {
    return null;
  }

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

  @Override
  public ParcelFileDescriptor openFile(Uri uri, String mode)
  {
    int imode = 0;
    if (mode.contains("w"))
      imode |= ParcelFileDescriptor.MODE_WRITE_ONLY;
    if (mode.contains("r"))
      imode |= ParcelFileDescriptor.MODE_READ_ONLY;
    if (mode.contains("+"))
      imode |= ParcelFileDescriptor.MODE_APPEND;
    try
    {
      return ParcelFileDescriptor.open(new File(uri.getEncodedPath()), imode);
    }
    catch (FileNotFoundException e)
    {
      e.printStackTrace();
    }
    return null;
  }

  @Override
  public Cursor query(Uri uri, String[] projection, String selection,
      String[] selectionArgs, String sortOrder)
  {
    return null;
  }

  @Override
  public int update(Uri uri, ContentValues values, String selection,
      String[] selectionArgs)
  {
      return 0;
  }
}

А потом моя функция экспорта:


private void exportImage()
{
    storeBitmapOnDisk();
    Intent i = new Intent(Intent.ACTION_SEND);
    i.addCategory(Intent.CATEGORY_LAUNCHER);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
        | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
    i.putExtra(Intent.EXTRA_STREAM, Uri.withAppendedPath(
        ExportContentProvider.CONTENT_URI, context.getFileStreamPath(
            "export.png").getAbsolutePath()));
    i.setType("image/png");
    i.setComponent(componentName);
    if (exportFileObserver == null)
    {
      this.bitmapPath = context.getFileStreamPath("export.png")
          .getAbsolutePath();
      exportFileObserver = new ExportFileObserver(this.bitmapPath);
      exportFileObserver.startWatching();
    }
    listener.launchExportActivity(Dms.ACT_IMAGE_EXPORT, i);
  }

Тем не менее осталось 2 проблемы: - При попытке удалить мой временный файл export.png из внутренней памяти, используя результат действия, я получил onResult при запуске действия ... - Это не работает для почтового приложения в моем эмуляторе 2.3. Я получаю сообщение "File to large" ...

Соменон это проверял?

...