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