Autore Topic: Spostamento files apk  (Letto 689 volte)

Offline CrotaNexus

  • Utente normale
  • ***
  • Post: 156
  • Vuolsi così colà dove si puote ciò che si vuole
  • Respect: +25
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    SimoneDev
  • Sistema operativo:
    Windows 8.1
Spostamento files apk
« il: 29 Ottobre 2013, 19:42:08 CET »
0
Salve, io ho una ListView nel quale sono presenti tutte le applicazioni installate nel dispositivo. Ho implementato un Context Menu, il quale comprende una voce chiamata "Estrai". L'intento è quello di fare una sorta di APK Extractor, copiando l'APK dalla cartella /data/app/ in un'altra cartella. Per fare ciò, ho trovato su StackOverflow il seguente snippet, molto simile al mio.

Codice (Java): [Seleziona]
public boolean onContextItemSelected(MenuItem item) {
            AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
            final long examId = info.id;
            ApplicationInfo app = applist.get((int) info.id);

            switch (item.getItemId()) {

 case ESTRAI:
            {

                try{
                      File f1 = new File("/data/app"+app.packageName);
                      File f2 = new File("storage/emulated/0/APK");
                      InputStream in = new FileInputStream(f1);

                      //For Append the file.
                    //  OutputStream out = new FileOutputStream(f2,true);

                      //For Overwrite the file.
                      OutputStream out = new FileOutputStream(f2);

                      byte[] buf = new byte[1024];
                      int len;
                      while ((len = in.read(buf)) > 0){
                      out.write(buf, 0, len);
                      }
                      in.close();
                      out.close();
                     Toast.makeText(getBaseContext(), "Success", Toast.LENGTH_SHORT).show();
                      }
                      catch(FileNotFoundException ex){
                          Toast.makeText(getBaseContext(), ex.getMessage() + " in the specified directory.", Toast.LENGTH_SHORT).show();
                      }
                      catch(IOException e){
                      System.out.println(e.getMessage());  
                      }


            }

return true;

}
}

L'errore riportato e mostrato nel Toast è ": /data/appcom.NomeDelPackage.Package: open failed: ENOENT (No such file or directory) in the specified directory. " Dov'è l'errore e come posso risolverlo? Preciso che questo tipo di approccio storage/emulated/0/APK è da sostituire in quanto non sarebbe compatibile con le versioni di Android inferiori alla 4.2. Grazie in anticipo per eventuali aiuti, suggerimenti e più in generale responsi.

Simone
SimoneDev @ Google Play Store

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:Spostamento files apk
« Risposta #1 il: 30 Ottobre 2013, 01:30:11 CET »
0
Codice (Java): [Seleziona]
public boolean onContextItemSelected(MenuItem item) {
                      File f1 = new File("/data/app"+app.packageName);
                      File f2 = new File("storage/emulated/0/APK");

Sicuramente manca uno slash qui:
Codice (Java): [Seleziona]
/data/app/
Poi storage/emulated/0/APK andrebbe sostituito con
Codice (Java): [Seleziona]
Environment.getExternalStorageDirectory()
Lo /0/ è valido solo se c'è un solo profilo su quel device.
Sui tablet 4.2+ puoi avere più profili e a quel punto rischi di scrivere in una folder errata.

Infine... ho i miei bei dubbi che quello che stai scrivendo possa funzionare. Non è permesso. (a meno che non hai i permessi di root).



ps. la prossima volta formatta il codice, così è illeggibile

Offline CrotaNexus

  • Utente normale
  • ***
  • Post: 156
  • Vuolsi così colà dove si puote ciò che si vuole
  • Respect: +25
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    SimoneDev
  • Sistema operativo:
    Windows 8.1
Re:Spostamento files apk
« Risposta #2 il: 30 Ottobre 2013, 06:17:46 CET »
0
Ciao, grazie per aver risposto. Chiedo venia per l'errata formattazione del codice. Si, come ho detto quel tipo di approccio non va bene ed è da sostituire. Ammesso che si abbia il Root, non si potrebbero usare i comandi della Shell per copiare l'APK? In alternativa, quale altra strada potrei usare? Preciso che questo snippet, nonostante ho fatto varie modifiche, non funziona sul mio Galaxy Nexus (4.3.1) Rootato.

Inviato dal mio Galaxy Nexus con Tapatalk 2
« Ultima modifica: 30 Ottobre 2013, 06:21:24 CET da CrotaNexus »
SimoneDev @ Google Play Store

Offline CrotaNexus

  • Utente normale
  • ***
  • Post: 156
  • Vuolsi così colà dove si puote ciò che si vuole
  • Respect: +25
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    SimoneDev
  • Sistema operativo:
    Windows 8.1
Re:Spostamento files apk
« Risposta #3 il: 09 Novembre 2013, 18:04:07 CET »
0
Ho risolto! Ringrazio l'utente Dema121 per avermi proposto la soluzione da lui trovata. Posto il codice nel caso servisse a qualcuno in futuro. Permette di copiare l'Apk in una cartella pre-creata, utilizzando l'istruzione cp (copy).

Codice (Java): [Seleziona]
PackageManager Pm = getPackageManager();
                    ApplicationInfo applicationInfo;
                   
                    try {
                        applicationInfo = Pm.getApplicationInfo(app.packagename, 0);
                        String path = applicationInfo.sourceDir;

                        File customfolder=new File(Environment.getExternalStorageDirectory().toString()+File.separator+"BackupApplicazioni");
                        customfolder.mkdir();
                       
                        if(customfolder.exists()) {
                            Process c = Runtime.getRuntime().exec("cp "+path+" "+customfolder);

                            return true;
                            }
                           
                            else {
                                return false;
                            }
                       
                    } catch (NameNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
« Ultima modifica: 03 Gennaio 2014, 21:03:52 CET da CrotaNexus »
SimoneDev @ Google Play Store