Autore Topic: Condivisione immagini memorizzate in APK  (Letto 1793 volte)

Offline Anna Gabrielli

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Google+
    • http://www.linkedin.com/profile/view?id=103996091&goback=%2Enmp_*1_*1_*1_*1_*1_*1_*1_*1_*1_*1&trk=spm_pic
    • annagabrielli80
    • acupofcode
    • Mostra profilo
  • Dispositivo Android:
    HTC Widlfire S
  • Sistema operativo:
    Mac OS 10.6.8, Linux Debian Squeeze
Condivisione immagini memorizzate in APK
« il: 10 Settembre 2013, 13:56:18 CEST »
0
Ciao ragazzi,
ho una piccola app che permette di selezionare delle immagini e condividerle con alcuni programmi.. gmail, whatsapp, etc.
Fino qui niente di strano salvo che quando parte la startActivity(intent), si apre il programma 'destinatario' e poi compare simpaticamente un toast che dice "Condivisione fallita, riprovare piu' tardi"ora vi metto un po' di codice:
questa e' la parte di codice presente in un file Activity che dovrebbe gestire l'azione di condivisione:
Codice (Java): [Seleziona]
 Intent sendIconInt = new Intent();
 sendIconInt.setAction(Intent.ACTION_SEND);
 sendIconInt.setType("image/*");
 AssetManager mgr = getApplicationContext().getResources().getAssets();
 String imgToSend = (gAdapter.imgList.get(selected).getImgName());
 File file = new File(imgToSend);
 sendIconInt.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file) );
 startActivity(sendIconInt);
questa di seguito e' l'activity nel file xml
Codice (Winbatch): [Seleziona]
<intent-filter>
        <action android:name="android.intent.action.SEND_MULTIPLE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
     
ho provato a fare quanto spiegato in diversi tutorial
e altri che non trovo piu' ora...
questa e' l'ultima versione.. no provato anche senza passare dalla creazione di un file a partire dalla stringa del nome..
Il fatto e' che non mi viene generato alcun tipo di errore. ho provato a fare dei log e le operazioni vengono eseguite tutte fino in fondo
ho la sensazione che il problema sia di whatsapp ma d'altra parte sono titubante circa la creazione dell'uri relativo al file
Insomma, una cosa banalissima mi ha fatto friggere il cervello

Spero di aver scritto tutto e nel posto giusto (ho cercato qualcosa di simile ma mi pare di essere l'unica sfigata cn questo problema  :-(
Grazie a tutti
un saluto
anna

Offline matttt

Re:Condivisione immagini memorizzate in APK
« Risposta #1 il: 10 Settembre 2013, 14:02:33 CEST »
+1
Ma... in setType imposti proprio "image/*" ?
Dovresti mettere un MIME type corretto penso.
"image/png", "image/gif", etc. oppure più genericamente "application/octet-stream" per un file binario
Le mie apps su Google Play Store:

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Condivisione immagini memorizzate in APK
« Risposta #2 il: 10 Settembre 2013, 14:39:21 CEST »
+1
Ma dove stanno queste immagini?

Offline Anna Gabrielli

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Google+
    • http://www.linkedin.com/profile/view?id=103996091&goback=%2Enmp_*1_*1_*1_*1_*1_*1_*1_*1_*1_*1&trk=spm_pic
    • annagabrielli80
    • acupofcode
    • Mostra profilo
  • Dispositivo Android:
    HTC Widlfire S
  • Sistema operativo:
    Mac OS 10.6.8, Linux Debian Squeeze
Re:Condivisione immagini memorizzate in APK
« Risposta #3 il: 10 Settembre 2013, 15:42:14 CEST »
0
Ricky le immagini sono nella folder assets suddivise in 3 cartelle per le risoluzioni (ldpi, mdpi e hdpi). Si tratta delle stesse immagini che con size differenti. Poi ho creato res/values-mdpi, res/values/ldpi e res/values/hdpi.
Ciascuna di queste folder contiene un xml chiamato subpath.xml con il segg. codice:
Codice (XML): [Seleziona]
 <resources>
        <string name="subpath">hdpi</string>
    </resources>
qui vedi hdpi ma cambia a seconda della rispettiva cartella (hdpi per values-hdpi, mdpi per values-mdpi e ldpi per values-ldpi).
Ho provato a fare una stampa della stringa e il nome del file viene caricato correttamente (almeno credo), in base alla risoluzione del device (mdpi/nomefile.png)

/==============
matttt si, ho provato ma inserendo quel tipo generico si riducono i programmi cn cui condividere. ho fatto una prova cercando di inviare in posta l'immagine. La mail parte ma arriva vuota...

vuoi vedere che il problema e' la divisione dei file nelle cartelle?!... avevo seguito una guida legata a come caricare correttamente le immagini giuste per in base ai device...

Beh grazie intanto per l'aiuto  :-)
anna

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Condivisione immagini memorizzate in APK
« Risposta #4 il: 10 Settembre 2013, 15:49:45 CEST »
+1
Credo che il problema sia proprio quello, devi mettere le immagini che vuoi condividere in un qualche path accessibile anche dalle altre app. Potresti ad esempio spostare l'immagine che vuoi condividere nella cartella che ti viene ritornata da Context.getExternalCacheDir() che essendo sulla memoria sd è accessibile anche dalle altre app.

Offline Anna Gabrielli

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Google+
    • http://www.linkedin.com/profile/view?id=103996091&goback=%2Enmp_*1_*1_*1_*1_*1_*1_*1_*1_*1_*1&trk=spm_pic
    • annagabrielli80
    • acupofcode
    • Mostra profilo
  • Dispositivo Android:
    HTC Widlfire S
  • Sistema operativo:
    Mac OS 10.6.8, Linux Debian Squeeze
Re:Condivisione immagini memorizzate in APK
« Risposta #5 il: 10 Settembre 2013, 15:52:58 CEST »
0
ok grazie ora provo e vi aggiorno :) 
grazie :-*
anna

Post unito: 10 Settembre 2013, 17:06:55 CEST
quindi.. una roba cosi'?
Codice (Java): [Seleziona]
 Intent sendIconInt = new Intent();
 sendIconInt.setAction(Intent.ACTION_SEND);
 sendIconInt.setType("image/jpeg");
 String imgToSend = (gAdapter.imgList.get(selected).getImgName());
 File externalRoot = Environment.getExternalStorageDirectory();
 File tempDir = new File(externalRoot, imgToSend);
 sendIconInt.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(tempDir) );
 startActivity(sendIconInt);                                           
spero di aver sbagliato qualcosa perche' nn funziona.. o.O
« Ultima modifica: 10 Settembre 2013, 17:28:16 CEST da Anna Gabrielli »

Offline matttt

Re:Condivisione immagini memorizzate in APK
« Risposta #6 il: 10 Settembre 2013, 18:49:06 CEST »
+1
Credo che Ricky intenda dire di provare a copiare fisicamente il file della risorsa in un percorso accessibile alle altre app.
Il path dovrebbe andare bene come l'hai creato ma ti consiglio di controllare che externalRoot non sia null, alcuni dispositivi (tipo il Nexus 7) non hanno partizione esterna (o non è disponibile per determinate ragioni)

Puoi crearti una funzione di copia tipo:
Codice (Java): [Seleziona]
InputStream in = getResources().openRawResource(R.raw.myresource);
FileOutputStream out = new FileOutputStream( path );
byte[] buff = new byte[1024];
int read = 0;
try {
    while ((read = in.read(buff)) > 0) {
        out.write(buff, 0, read);
    }
} finally {
    in.close();
    out.close();
}
Le mie apps su Google Play Store:

Offline Anna Gabrielli

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Google+
    • http://www.linkedin.com/profile/view?id=103996091&goback=%2Enmp_*1_*1_*1_*1_*1_*1_*1_*1_*1_*1&trk=spm_pic
    • annagabrielli80
    • acupofcode
    • Mostra profilo
  • Dispositivo Android:
    HTC Widlfire S
  • Sistema operativo:
    Mac OS 10.6.8, Linux Debian Squeeze
Re:Condivisione immagini memorizzate in APK
« Risposta #7 il: 10 Settembre 2013, 18:54:22 CEST »
0
ok ora provo
grazie  :-* :-*

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Condivisione immagini memorizzate in APK
« Risposta #8 il: 10 Settembre 2013, 20:28:24 CEST »
+1
Premessa : Non l'ho provata.

Esiste la possibilità di accede ad una risorsa (qualsiasi) attraverso un URI.
L'URI deve essere scritto in questo modo:

android.resource://[package_name]/[res_type]/[res_id]

Attraverso un URI si può condividere le risorse con le altre applicazioni.
E da documentazione si può usare questo URI con uno share Intent.
Per assurdo, conoscendo il percorso delle risorse (package e name), si potrebbe accedere a qualsiasi risorsa.

Presumo che devi usare questo codice:
Codice (Java): [Seleziona]
 sendIconInt.putExtra(Intent.EXTRA_STREAM, Uri.parse("android.resource://miopackage/drawable/"+ Integer.toString(R.drawable.miaImmagine)  ));o
Codice (Java): [Seleziona]
 sendIconInt.putExtra(Intent.EXTRA_STREAM, Uri.parse("android.resource://miopackage/drawable/"+ R.drawable.miaImmagine ));
« Ultima modifica: 10 Settembre 2013, 21:37:36 CEST da GabMarioPower »

Offline Anna Gabrielli

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Google+
    • http://www.linkedin.com/profile/view?id=103996091&goback=%2Enmp_*1_*1_*1_*1_*1_*1_*1_*1_*1_*1&trk=spm_pic
    • annagabrielli80
    • acupofcode
    • Mostra profilo
  • Dispositivo Android:
    HTC Widlfire S
  • Sistema operativo:
    Mac OS 10.6.8, Linux Debian Squeeze
Re:Condivisione immagini memorizzate in APK
« Risposta #9 il: 10 Settembre 2013, 21:10:57 CEST »
0
GabMarioPower Ti ringrazio molto per il contributo. Questa era in realta' la prima cosa che ho fatto..pero' nn e' possibile accedere in questo modo alle risorse da apk da quanto ho capito in seguito..
cmq, dopo aver scritto faro' un altro tentativo. Magari ho sbagliato qualcosa io e le tue righe potrebbero darmi la luce..
Nel frattempo ho messo in atto quanto consigliatomi da Matttt e Ricky: vi allego il codice precedendolo da una spiegazione:
1a parte di codice: le immaginine vengono precedentemente caricare e mostrate tutte: ho pensato di memorizzarle su externalstorage durante questo primo ciclo di lettura

1a parte di codice: carico il file per l'invio. ho fatto un Log.e (si vabbeh mi piace il rosso :D ) per vedere la stringa di caricamento e verificarne la giustezza.. ahime' sembra giusto nke quello....cmq, andiamo cn ordine:
/=================
1a parte codice - carico per mostrare successivamente in gridview e salvo su sdcard
/=================
Codice (Java): [Seleziona]
in = mgr.open(imgList.get(position).getImgName());
                        FileOutputStream out = new FileOutputStream(  Environment.getExternalStorageDirectory() );
                        byte[] buff = new byte[1024];
                        int read = 0;
                        try {
                            while ((read = in.read(buff)) > 0) {
                                out.write(buff, 0, read);
                            }
                        } finally {
                            in.close();
                            out.close();
                        }
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
/=======================
2a parte codice - passo il file all'intent
/=======================
 Intent sendIconInt = new Intent();
 sendIconInt.setAction(Intent.ACTION_SEND);
 sendIconInt.setType("image/png");
 String imgToSend = (gAdapter.imgList.get(selected).getImgName());
 File externalRoot = Environment.getExternalStorageDirectory();
 if( externalRoot != null ){
  File tempDir = new File(externalRoot, imgToSend);
  sendIconInt.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(tempDir) );
 }
startActivity(sendIconInt);
/=========

il log che ho fatto per vedere cosa ci fosse in tempDir (un brutale tempDir.toString() ):
/mnt/sdcard/mdpi/nomeimmagine.png

quindi mi pare abbia fatto quello che doveva
(le img "originarie" sono sotto asset)

>.< disperazione.. sto iniziando a pensare sia irrisolvibile.. O.O
Ultima nota: sto testanto su un'API 9 (android 2.3 e i metodi che uso risultano disponibili su developer.android.com)

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Condivisione immagini memorizzate in APK
« Risposta #10 il: 10 Settembre 2013, 21:37:00 CEST »
+1
GabMarioPower Ti ringrazio molto per il contributo. Questa era in realta' la prima cosa che ho fatto..pero' nn e' possibile accedere in questo modo alle risorse da apk da quanto ho capito in seguito..
cmq, dopo aver scritto faro' un altro tentativo. Magari ho sbagliato qua

Domani provo il mio codice.
Attenzione però ad una cosa.

Quello che tu hai scritto all'inizio è molto diverso dal codice che ti ho suggerito.
Innanzitutto è fondamentale capire che non esiste alcuna folder drawable e drawable/xxx dentro l'apk. E' solo nell'ambiente di sviluppo.
E tu stavi provando a fare
File file = new File(xxxx) accedendo alle folder drawable/mdpi .... il che è impossibile perchè quel percorso non esiste proprio.

Con l'URI non devi aggiungere mdpi, hdpi, devi solo mettere drawable.

Offline Anna Gabrielli

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Google+
    • http://www.linkedin.com/profile/view?id=103996091&goback=%2Enmp_*1_*1_*1_*1_*1_*1_*1_*1_*1_*1&trk=spm_pic
    • annagabrielli80
    • acupofcode
    • Mostra profilo
  • Dispositivo Android:
    HTC Widlfire S
  • Sistema operativo:
    Mac OS 10.6.8, Linux Debian Squeeze
Re:Condivisione immagini memorizzate in APK
« Risposta #11 il: 10 Settembre 2013, 21:40:39 CEST »
0
no scusa, mi sono spiegata male: ho fatto una cosa simile alla tua stanotte (ieri notte..), e stamattina..
il codice che ho mostrato ora non c'entra.
e il mdpi che vedi nella stringa è stata estratta dall'apk
cmq intanto ti ringrazio e ora riprovo rifacendo esattamente come mi dici tu.

grazie ancora
anna

Post unito: 11 Settembre 2013, 10:37:28 CEST
Buongiorno ragazzi,
aggiorno e chiudo il post. L'insieme di tutte le idee mi ha portato alla soluzione.
Codice (Java): [Seleziona]
 in = mgr.open(imgList.get(position).getImgName());
 File file = new File(Environment.getExternalStorageDirectory(), imgList.get(position).getImgName().substring(5));
 file.createNewFile();
 FileOutputStream out = new FileOutputStream(file,false);
 byte[] buff = new byte[1024];
 int read = 0;
 try {
  while ((read = in.read(buff)) > 0) {
    out.write(buff, 0, read);
  }
 } finally {
  in.close();
  out.close();
 }
con questa funzione copio effettivamente i file. La cosa importante e' che se non lo abbiamo fatto, dobbiamo ricordarci si settare
Codice (XML): [Seleziona]
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />all'interno del manifest
per inviare l'intent con l'immagine infine:
Codice (Java): [Seleziona]
String imgToSend = (gAdapter.imgList.get(selected).getImgName());
 File externalRoot = Environment.getExternalStorageDirectory();
 if( externalRoot != null ){
  File tempDir = new File(externalRoot, imgToSend.substring(5));
  sendIconInt.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(tempDir) );
 }
 startActivity(sendIconInt);                                           

il metodo:
Codice (Java): [Seleziona]
.substring(5)
mi permette di caricare correttamente le immagini
(tramite un xml configurato, ho inserito in tre folder differenti le stesse immagini cn size diverse per scegliere la risoluzione giusta)

Direi di avere scritto tutto, sperando che possa essere di aiuto anche per altri programmatori.
Vi ringrazio che date sempre. E' meraviglioso oltre che utilissimo  :-* :-*
Buona giornata a tutti
saluti
anna
« Ultima modifica: 11 Settembre 2013, 10:37:56 CEST da Anna Gabrielli, Reason: Merged DoublePost »