Android Копировать изображение в буфер обмена / clipdata

android image copy jpeg clipboard

3930 просмотра

1 ответ

258 Репутация автора

Длительное нажатие на изображения в Интернете или в других местах дает мне возможность скопировать изображение в буфер обмена моего устройства. Глянь сюда:

пример

Теперь я хочу реализовать это в моем приложении. Что у меня так далеко:

Код

Bitmap bitmap = getBitmap();
        File file = storeImage(bitmap, name);

        //Share
        Intent shareIntent = new Intent(Intent.ACTION_SEND);
        shareIntent.setType("image/*");
        Uri uri = Uri.fromFile(file);
        shareIntent.putExtra(Intent.EXTRA_STREAM, uri);

        //Add Copy to Clipboard to choosers
        Intent clipboard = new Intent(this, CopyToClipboardImageActivity.class);
        clipboard.setData(uri);

        Intent chooserIntent = Intent.createChooser(shareIntent, getString(R.string.shareScreenshot));
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{clipboard});
        startActivity(chooserIntent);

CopyToClipboardImageActivity

  public class CopyToClipboardImageActivity extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            Uri uri = getIntent().getData();
            if (uri != null) {
                copyImageToClipboard(uri);
                Toast.makeText(this, getString(R.string.hinweisInZwischenablageKopiert), Toast.LENGTH_SHORT).show();
            }

            // Finish right away. We don't want to actually display a UI.
            finish();
        }

        private void copyImageToClipboard(Uri uri) {
            ClipboardManager mClipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
            ContentValues values = new ContentValues(2);
            values.put(MediaStore.Images.Media.MIME_TYPE, "Image/jpg");
            values.put(MediaStore.Images.Media.DATA,  "file://"+uri.getPath());

            ContentResolver theContent = getContentResolver();
            Uri imageUri = theContent.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
            ClipData theClip = ClipData.newUri(getContentResolver(), "Image", imageUri);
            mClipboard.setPrimaryClip(theClip);
        }
    }

Но это еще не работает. Либо он только копирует странный путь в буфер обмена (см. Рисунок выше ^^), либо я получаю следующее исключение NullpointerException:

Попытка вызвать виртуальный метод 'java.lang.String android.net.Uri.getScheme ()' для пустой ссылки на объект

в этой строке ClipData theClip = ClipData.newUri(getContentResolver(), "Image", imageUri);

Автор: XxGoliathusxX Источник Размещён: 19.07.2016 02:33

Ответы (1)


2 плюса

7597 Репутация автора

Не используйте значения базы данных MediaStore. Сохраните изображение на SDCard, где у вас есть разрешение на его использование. Как получить разрешения (mainifest):

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.html2pdf"
        android:versionCode="1"
        android:versionName="1.0" >

        <uses-sdk
            android:minSdkVersion="16"
            android:targetSdkVersion="19" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"         />    
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"        />
                <activity
            android:name=".CopyToClipboardImageActivity"
            android:label="@string/app_name" >
                <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SEND_MULTIPLE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
        </activity>
some code:

        final File sdcard = Environment.getExternalStorageDirectory();
        String absoluteFilePath = sdcard.getAbsolutePath() + "/tmp.jpg";
        File aFile = saveBitmap(bitmap , sdcard.getAbsolutePath(), "tmp", Bitmap.CompressFormat.JPEG);


            Intent shareIntent = new Intent(Intent.ACTION_SEND);
            shareIntent.setType("image/*");
            Uri uri = Uri.fromFile(new File(absoluteFilePath));
            shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
            startActivity(shareIntent );

    /**
     * Saves the bitmap by given directory, filename, and format; if the directory is given null,
     * then saves it under the cache directory.
     */
    int DEFAULT_COMPRESS_QUALITY = 100;
    public File saveBitmap(
            Bitmap bitmap, String directory, String filename, CompressFormat format) 
    {
        if (directory == null) 
        {
            directory = this.getCacheDir().getAbsolutePath();
        } else 
        {
            // Check if the given directory exists or try to create it.
            File file = new File(directory);
            if (!file.isDirectory() && !file.mkdirs()) 
            {
                return null;
            }
        }

        File file = null;
        OutputStream os = null;
        try {
            filename = (format == CompressFormat.PNG) ? filename + ".png" : filename + ".jpg";
            file = new File(directory, filename);
            os = new FileOutputStream(file);
            bitmap.compress(format, DEFAULT_COMPRESS_QUALITY, os);
        } catch (FileNotFoundException e) 
        {
            e.printStackTrace();
        } finally {
            try {
                os.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return file;
    }
}

Этот материал буфера обмена не работает для вставки изображений, см. Копирование-вставка изображения в Android с помощью диспетчера буфера обмена.

Автор: Jon Goodwin Размещён: 27.07.2016 07:54
Вопросы из категории :
32x32