2016-07-19 39 views
6

Długie naciśnięcie na obrazy w Internecie lub w innych miejscach daje mi możliwość skopiowania obrazu do schowka mojego urządzenia. Zobacz tutaj:Android Kopiuj obraz do schowka/clipdata

Example

Teraz chcę wdrożyć to w mojej aplikacji. Co mam tak daleko:

Kod

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

Ale to jeszcze nie działa. Albo kopiuje dziwną ścieżkę do schowka (patrz zdjęcie powyżej ^^) lub otrzymuję następujący wyjątek NullpointerException:

Próba wywołania metody wirtualnej "java.lang.String android.net.Uri.getScheme()" na null obiektu

w tej linii ClipData theClip = ClipData.newUri(getContentResolver(), "Image", imageUri);

Odpowiedz

2

nie używaj wartości bazy Mediastore. Zapisz obraz na sdcard, gdzie masz pozwolenie na jego użycie. Jak zdobyć uprawnienia (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; 
    } 
} 

ten schowek rzeczy nie działa wklejanie zdjęć, zobacz: Copy-Paste image in Android using Clipboard Manager