Android copy image to clipboard / clipdata

A long press on the images on the Internet or in other places gives me the opportunity to copy the image to the clipboard of my device. See here:

Example

Now I want to implement this in my application. What I still have:

the code

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); } } 

But this does not work yet. Either it only copies the strange path to the clipboard (see above ^^), or I get the following NullpointerException:

Trying to call the virtual method 'java.lang.String android.net.Uri.getScheme ()' to reference a null object

in this line ClipData theClip = ClipData.newUri(getContentResolver(), "Image", imageUri);

+6
source share
1 answer

Do not use MediaStore database values. Save the image to an SD card where you have permission to use it. How to get permissions (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; } } 

This clipboard material does not work for pasting images, see Copy paste image in Android using clipboard manager

+2
source

All Articles