2011-11-24 16 views
10

Mam ImageView z intencją akcji (która działa świetnie, wyświetla wszystkie aplikacje, w których mogę udostępnić obraz), jednak nie mogę udostępnić zdjęcia, ponieważ nie ma ścieżki na moim telefonie. Jak mogę zapisać ImageView na moim telefonie? Poniżej znajduje się mój kod.Jak zapisać obraz jako obraz?

public void taptoshare(View v) 
{ 
    View content = findViewById(R.id.myimage); 
    content.setDrawingCacheEnabled(true); 
     Bitmap bitmap = content.getDrawingCache(); 
     File file = new File("/DCIM/Camera/image.jpg"); 
     try 
     { 
      file.createNewFile(); 
      FileOutputStream ostream = new FileOutputStream(file); 
      bitmap.compress(CompressFormat.JPEG, 100, ostream); 
      ostream.close(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 


    Intent shareIntent = new Intent(Intent.ACTION_SEND); 
    Uri phototUri = Uri.parse("/DCIM/Camera/image.jpg"); 
    shareIntent.setData(phototUri); 
    shareIntent.setType("image/*"); 
    shareIntent.putExtra(Intent.EXTRA_STREAM, phototUri); 
    startActivity(Intent.createChooser(shareIntent, "Share Via")); 

} 
} 

UPDATE Ok, więc ja zdobione. Teraz mam nowe pytanie, w jaki sposób chciałbym zapisać ten obraz w nowym folderze?

+0

Nowe pytanie należy podać osobno, ponieważ nie można przyznać wielu odpowiedzi na jedno pytanie. W każdym razie plik ma metodę mkdirs(), która może być używana do zapewnienia istnienia określonego folderu. – AlbeyAmakiir

+0

o dzięki, @AlbeyAmakiir! Uwaga dla przyszłych postów! – dabious

Odpowiedz

4

Podczas zapisywania i ładowania należy najpierw uzyskać ścieżkę główną systemu. Tak bym to zrobił.

File root = Environment.getExternalStorageDirectory(); 
File cachePath = new File(root.getAbsolutePath() + "/DCIM/Camera/image.jpg"); 
+0

Dodałem, że w, ale nadal nie działa..na sugestie? – dabious

+0

to działa teraz! Wielkie dzięki!! – dabious

+2

@dabious możesz udostępnić działające rozwiązanie. – User404

1

Znalazłem kilka rozwiązań, które nie rozwiązują tego problemu.

Oto rozwiązanie, które sprawdziło się u mnie. Jeden haczyka jest potrzebne do przechowywania obrazów w udostępnionym lub nie app prywatnej lokalizacji (http://developer.android.com/guide/topics/data/data-storage.html#InternalCache)

Wiele sugestii powiedzenia przechowywać w „prywatnej” lokacja Apps ale to oczywiście nie jest accessable za pośrednictwem innych aplikacji zewnętrznych, w tym ogólny zamiar Share App File, który jest wykorzystywany. Gdy spróbujesz, uruchomi się, ale na przykład dropbox powie Ci, że plik nie jest już dostępny.

/* KROK 1 - Zapisz plik mapy bitowej lokalnie, korzystając z funkcji zapisywania plików poniżej. */

localAbsoluteFilePath = saveImageLocally(bitmapImage); 

/* Krok 2 - Podziel non prywatną ścieżkę Absolute pliku do intencji plików akcja */

if (localAbsoluteFilePath!=null && localAbsoluteFilePath!="") { 

    Intent shareIntent = new Intent(Intent.ACTION_SEND); 
    Uri phototUri = Uri.parse(localAbsoluteFilePath); 

    File file = new File(phototUri.getPath()); 

    Log.d("file path: " +file.getPath(), TAG); 

    if(file.exists()) { 
     // file create success 

    } else { 
     // file create fail 
    } 
    shareIntent.setData(phototUri); 
    shareIntent.setType("image/png"); 
    shareIntent.putExtra(Intent.EXTRA_STREAM, phototUri); 
    activity.startActivityForResult(Intent.createChooser(shareIntent, "Share Via"), Navigator.REQUEST_SHARE_ACTION); 
} 

/* zapisz obraz funkcji */

private String saveImageLocally(Bitmap _bitmap) { 

     File outputDir = Utils.getAlbumStorageDir(Environment.DIRECTORY_DOWNLOADS); 
     File outputFile = null; 
     try { 
      outputFile = File.createTempFile("tmp", ".png", outputDir); 
     } catch (IOException e1) { 
      // handle exception 
     } 

     try { 
      FileOutputStream out = new FileOutputStream(outputFile); 
      _bitmap.compress(Bitmap.CompressFormat.PNG, 90, out); 
      out.close(); 

     } catch (Exception e) { 
      // handle exception 
     } 

     return outputFile.getAbsolutePath(); 
    } 

/* KROK 3 - Handle Share File Intent result. Trzeba zdalny plik tymczasowy itd. */

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

      // deal with this with whatever constant you use. i have a navigator object to handle my navigation so it also holds all mys constants for intents 
     if (requestCode== Navigator.REQUEST_SHARE_ACTION) { 
      // delete temp file 
      File file = new File (localAbsoluteFilePath); 
      file.delete(); 

      Toaster toast = new Toaster(activity); 
      toast.popBurntToast("Successfully shared"); 
     } 


    } 

/* * utils/

public class Utils { 
    //... 
    public static File getAlbumStorageDir(String albumName) { 

     // Get the directory for the user's public pictures directory. 
     File file = 
      new File(Environment.getExternalStorageDirectory(), albumName); 
     if (!file.mkdirs()) { 
      Log.e(TAG, "Directory not created"); 
     } 
     return file; 
    } 
    //... 
} 

Mam nadzieję, że ktoś pomoże.

+0

Występuje błąd w kroku 2 (Co to jest utils?): Plik outputDir = Utils.getAlbumStorageDir (Environment.DIRECTORY_DOWNLOADS); –

+0

@DinIslamMilon, przykro mi z tego powodu, minęło trochę czasu od pracy nad tym. Dodałem niestandardową instrukcję klasy statycznej, której używam. dostaje katalog zdjęć użytkowników – wired00