android image copy jpeg clipboard

Imagen de copia de Android en el portapapeles/clipdata



copy jpeg (1)

No use los valores de la base de datos MediaStore. Guarde la imagen en la tarjeta sd donde tenga permiso para usarla. Cómo obtener permisos (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; } }

Este material del portapapeles no funciona para pegar imágenes, consulte: Copiar y pegar imagen en Android con el Administrador de portapapeles

Presionar prolongadamente las imágenes en la web o en otros lugares me da la oportunidad de copiar una imagen en el portapapeles de mi dispositivo. Mira aquí:

Ahora quiero implementar esto en mi aplicación. Lo que tengo hasta ahora

Código

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

Pero esto no funciona todavía. O solo copia una ruta extraña al portapapeles (ver la imagen de arriba ^^) u obtengo la siguiente NullpointerException:

Intento de invocar el método virtual ''java.lang.String android.net.Uri.getScheme ()'' en una referencia de objeto nulo

en esta línea ClipData theClip = ClipData.newUri(getContentResolver(), "Image", imageUri);