Come accedere ai dati / cartella dati nel dispositivo Android?


316

Sto sviluppando un'app e so che il mio database *.dbapparirà indata/data/com.****.***

Posso accedere a questo file da AVD in Eclipse con l'aiuto del gestore sqlite

Ma non riesco ad accedere a questo file sul mio telefono Android.
Lo google e dice che devo fare il root del mio telefono per farlo, ma non voglio farlo. (Nuovo telefono, problemi di garanzia e problemi di sicurezza)

Quindi, ecco la mia domanda: come posso accedere alla mia data/data/.....rubrica nel mio telefono Android " senza effettuare il root "?

Posso modificare le autorizzazioni utente per la directory data/data.....senza eseguirne il root?


1
hai file database.db .. ???
Amit Prajapati,

sto usando il database - "openOrCreateDatabase (....)"
Naveen Prince P

5
Prima di tutto dovrai sradicare il telefono. Quindi avrai bisogno di un'app di file manager competente che puoi usare. Il file manager ASTRO è popolare ma non ha supporto per l'accesso root, quindi è inutile per gli utenti esperti. Dovresti essere in grado di utilizzare ES File Explorer o File Expert. Recentemente ho avuto problemi a visualizzare / dati / dati o altre cartelle protette con ES File Explorer e l'ho praticamente abbandonato, e ora sto usando File Expert. Entrambi richiedono di accedere alle impostazioni e abilitare l'opzione root explorer (e talvolta montare anche il file system come scrivibile). Quindi devi prima farlo.
Samir,

Non si tratta di domande o risposte relative alla programmazione.
SkyWalker,

Risposte:


375

Accedere ai file direttamente sul tuo telefono è difficile, ma potresti essere in grado di copiarli sul tuo computer dove puoi fare tutto quello che vuoi. Senza il rooting hai 2 opzioni:

  1. Se l'applicazione è debug è possibile utilizzare il run-ascomando nella shell adb

    adb shell
    run-as com.your.packagename 
    cp /data/data/com.your.packagename/
  2. In alternativa puoi utilizzare la funzione di backup di Android.

    adb backup -noapk com.your.packagename

    Verrà ora richiesto di "sbloccare il dispositivo e confermare l'operazione di backup". È meglio NON fornire una password, altrimenti diventa più difficile leggere i dati. Basta fare clic su "backup dei miei dati". Il file "backup.ab" risultante sul tuo computer contiene tutti i dati dell'applicazione nel formato di backup Android. Fondamentalmente è un file tar compresso. Questa pagina spiega come utilizzare il comando zlib di OpenSSL per decomprimerlo. È possibile utilizzare il adb restore backup.dbcomando per ripristinare il backup.


15
adb backup -f \location\on\local\drive -noapk app.package.nameha funzionato per me senza root
theblang il

24
Utilizzare questo comando per decomprimere il file di backup:dd if=backup.ab bs=24 skip=1|openssl zlib -d > backup.tar
Hooman

11
Nell'opzione 1, come posso dire al comando cp di salvarli sul mio laptop (Mac)? Se dai un esempio di Win, mi piacerebbe saperlo anche io e lo tradurrò semplicemente. Grazie.
Gerard,

10
Importante: L' esecuzione adb backup -noapk com.your.packagenamesalverà il file ab nella directory corrente , quindi assicurati di aver navigato nella directory giusta (ad es. cd Desktop..)
Menelaos Kotsollaris

6
Si noti che l'approccio di backup genererà un backup vuoto se l'app ha disabilitato i backup tramite android:allowBackup="false"nel manifest.
Tom,

130

Se stai utilizzando Android Studio 3.0 o versione successiva, segui questi passaggi.

  1. Fare clic su Visualizza > Windows degli strumenti > Esplora file dispositivo .
  2. Espandi / data / data / nodi [nome pacchetto] .

È possibile espandere solo i pacchetti che vengono eseguiti in modalità debug su dispositivi non rootati.

Passaggi seguiti in Android Studio 3.0


1
non riesco a vedere nulla in questo dock. e non dirmi niente di spettacolo. sai qual è il problema?
Mahdi Azadbar,

1
Funziona solo in modalità debug, non per build-release
itinance il

Grazie per aver mostrato il modo no-pita di esaminare il file system!
Lensflare,

Sembra che non abbia l'opzione nella versione 3.0.1, è stata spostata?
Codingale

1
Questo e spettacolare. Vorrei averlo saputo poco fa.
checkmate711

59

Puoi anche provare a recuperare il db usando l'app root explorer. E se non funziona, puoi provare questo:

  1. Apri cmd
  2. Cambia la tua directory e vai su "Strumenti della piattaforma"
  3. Digita ' adb shell'
  4. su
  5. Premi "Consenti" sul dispositivo
  6. chmod 777 /data /data/data /data/data/com.application.package /data/data/com.application.package/*
  7. Apri la vista DDMS in Eclipse e da lì apri "FileExplorer" per ottenere il file desiderato

Successivamente, dovresti essere in grado di sfogliare i file sul dispositivo rootato.


2
penso che l'app di esplorazione root funzioni solo per i telefoni rooted. Proverò il 2o metodo
Naveen Prince P

5
Incapace di chmod / data: operazione non consentita
bofredo

@bofredo Penso che sia perché il tuo telefono non è rootato. dovresti
eseguire

1
@mahemadhi sì, probabilmente dovresti eseguire questo comando manualmente per ogni directory poiché tutte le directory dispongono di autorizzazioni private.
Sheraz Ahmad Khilji,

1
@VivekChavda yup hanno bisogno del telefono con root
Sheraz Ahmad Khilji

21

Per eseguire una delle operazioni precedenti (ovvero accedere alle cartelle protette dall'interno del telefono stesso), è comunque necessario il root. (Ciò include la modifica delle autorizzazioni di montaggio sulla cartella / data e l'accesso ad essa)

Senza root, accedendo /datadirettamente alla lettura eccetto dall'interno non è possibile dell'applicazione tramite il codice. Quindi potresti provare a copiare quel file su sdcard o da qualche parte accessibile, e quindi dovresti essere in grado di accedervi normalmente.

Il rooting non annulla la garanzia se si dispone di un dispositivo sviluppatore. Mi dispiace, non c'è altro modo AFAIK.


non sto usando un dispositivo per sviluppatori. Il mio è Xperia U
Naveen Prince P

posso modificare l'autorizzazione utente della cartella dati con i comandi chmode?
Naveen Prince P

L'intera partizione è montata in sola lettura. Direi che la tua scommessa migliore sarebbe adb pullquella indicata nella risposta di seguito.
Anirudh Ramanathan,

Sono possibile se l'applicazione lo consente. Le directory hanno tutte le autorizzazioni x per tutti (ma nessuna r per tutti, quindi devi conoscere il percorso). Ciò dipende dal fatto che l'applicazione abbia reso accessibile o meno il mondo dei file. Alcuni file lo sono, la maggior parte no.
Jan Hudec,

Prima dici che è impossibile leggere, quindi suggerisci di copiare il file altrove. Ma come copiare un file senza prima leggerlo? Penso che questa risposta sia errata.
fino al

13

Il modo più semplice (solo un semplice passaggio) per estrarre un file dalla cartella dell'applicazione debuggable (diciamo /data/data/package.name/databases/file) su un dispositivo Android 5.0+ non rootato è usando questo comando:

adb exec-out run-as package.name cat databases/file > file

12
  1. Apri il tuo prompt dei comandi
  2. Cambia directory in E: \ Android \ adt-bundle-windows-x86_64-20140702 \ adt-bundle-windows-x86_64-20140702 \ sdk \ platform-tools
  3. Inserisci i comandi seguenti
  4. adb -d shell
  5. run-as com.your.packagename cat databases/database.db > /sdcard/database.db
  6. Cambia directory in cd /sdcardper assicurarti che database.dbci sia.
  7. adb pull /sdcard/database.db o semplicemente puoi copiare database.db dal dispositivo.

Funziona perfettamente per me. Grazie! Ma nel mio caso, il nome del file di database non ha estensione .db.
technik,

10

Usa Esplora file in eclipse. Seleziona Windows => Mostra vista => Altro ... => Esplora file.

Un altro modo è estrarre il file tramite adb:

adb pull /system/data/data/<yourpackagename>/databases/<databasename> /sdcard

5

Ho avuto anche lo stesso problema una volta. Non è possibile accedere direttamente al file all'interno dei dispositivi Android tranne la shell adb o il dispositivo di rooting.

Accanto qui ci sono 02 alternative:

1)

 public void exportDatabse(String databaseName)
   {
     try {
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();

        if (sd.canWrite()) {
            String currentDBPath = "//data//"+getPackageName()+"//databases//"+databaseName+"";
            String backupDBPath = "backupname.db";
            File currentDB = new File(data, currentDBPath);
            File backupDB = new File(sd, backupDBPath);

            if (currentDB.exists()) {
                FileChannel src = new FileInputStream(currentDB).getChannel();
                FileChannel dst = new FileOutputStream(backupDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
            }
        }
    } catch (Exception e) {

    }
}

2) Prova questo: https://github.com/sanathp/DatabaseManager_For_Android


5

Per eseguire il backup da Android al desktop

Apri la riga di comando cmd ed esegui questo: backup adb -f C: \ Intel \ xxx.ab -noapk your.app.package . Non inserire la password e fare clic su Backup dei miei dati. Assicurarsi di non salvare sull'unità C root. Potresti essere negato. Ecco perché ho salvato su C: \ Intel.

Per estrarre il file * .ab

  1. Vai qui e scarica: https://sourceforge.net/projects/adbextractor/
  2. Estrarre il file scaricato e passare alla cartella in cui è stato estratto.
  3. eseguilo con i tuoi nomi di file: java -jar abe.jar decomprimere c: \ Intel \ xxx.ab c: \ Intel \ xxx.tar

1
Questa è un'ottima risposta, grazie. Ha funzionato per me per l'estrazione di un backup per singola app creato su un dispositivo Xiaomi (con estensione .bak). Non è richiesto il rooting
russo

4

Su un dispositivo rooted , la soluzione corretta è questa:

Open cmd
Change your directory and go into 'Platform tools'
Type 'adb shell'
su
Press 'Allow' on device
chmod 777 /data /data/data /data/data/*
Open DDMS view in Eclipse/IntelliJ and from there open 'FileExplorer' to get your desired file

La soluzione originale funzionava, ma chmod restituiva una directory sconosciuta. La modifica del comando chmod in / data / data / * ha consentito l'accesso a tutte le sottocartelle nella directory dei dati da DDMS in Intellij. Presumo che la stessa soluzione sia vera per Eclipse DDMS.

AGGIORNARE Quindi, quello che ho trovato è strano. Sto usando un Nexus 6 usando DDMS in IntelliJ (Android Device Monitor). Ho creato una piccola app per iniziare. Detta app salva i dati in un file .csv in data / data / com.example.myapp / files

Quando ho iniziato a provare ad accedere a questo file sul mio Nexus 6, ho scoperto che dovevo eseguire il root del dispositivo. Potevo vedere la cartella dei dati, ma provare ad aprirlo non avrebbe funzionato. Come menzionato online in altri luoghi, la funzione espandi + svanirebbe quindi riapparirà poco dopo (nota, ci sono soluzioni sul web che affermano di consentire l'accesso a queste cartelle senza root, non le ho trovate fino a tardi, e sono non sono sicuro se preferisco non effettuare il root ((preferirei essere in grado di farlo manualmente piuttosto che fare affidamento su un'app o un prompt dei comandi per darmi le mie soluzioni))). Ho rootato il mio 6 e ho provato di nuovo DDMS.

A questo punto, mi ha mostrato la cartella dei dati e ho potuto espandere la cartella e vedere la com. directory, ma non sono riuscito ad aprirne nessuna. Questo è quando ho scoperto la soluzione sopra. Le istruzioni iniziali non funzionerebbero su questa parte:

chmod 777 /data /data/data /data/data/com.application.pacakage /data/data/com.application.pacakage/*

Questo è quando ho provato la soluzione che ho pubblicato:

chmod 777 /data /data/data /data/data/*

Quella soluzione sembrava funzionare, ma solo su determinate cartelle. Ora potrei espandere la mia cartella myapp, ma non posso espandere la directory dei file in essa.

A questo punto, ho giocato per un po ', poi ho capito perché non provarlo nella directory di cui ho bisogno piuttosto che provare queste voci jolly.

chmod 777 /data /data/data /data/data/com.example.myapp/*

Seguito da:

chmod 777 /data /data/data /data/data/com.example.myapp/files

Questi comandi mi hanno permesso di espandere e visualizzare i file nella directory della mia app per confermare che il .csv veniva salvato correttamente.

Spero che questo aiuti qualcuno. Ho lottato con questo per ore!

(per complicare ulteriormente questo, stranamente, le autorizzazioni non sono passate al file .csv che è passato alla directory dei file. Le mie autorizzazioni per la directory dei file leggono drwxrwxrwx e le mie autorizzazioni per il file log.csv leggi -rw-rw --- - .. solo fyi)


2

Puoi scaricare un file sigle in questo modo:

adb exec-out run-as debuggable.app.package.name cat files/file.mp4 > file.mp4

Prima di scaricare potresti non dare un'occhiata alla struttura dei file nella tua App-Directory. A tale scopo, procedi come segue THelper:

adb shell
run-as com.your.packagename 
cd files
ls -als .

L' Android-Studio modo Shahidulmenzionato ( https://stackoverflow.com/a/44089388/1256697 lavoro) anche. Per coloro che non vedono l' DeviceFile Exploreropzione nel menu: assicurati di aprire la directory / android in Android Studio. Ad esempio, gli utenti con reazione nativa hanno questo all'interno della loro cartella di progetto allo stesso livello della directory / ios.


1

Uno dei modi semplici è quello di creare il database su SD-Card. Perché non è possibile accedere alla cartella dei dati del telefono nella memoria interna, a meno che non si esegua il root del telefono. Quindi perché non creare semplicemente il tuo database su SD-Card.

Inoltre, se lo si desidera, è possibile scrivere un codice di copia dei file per copiare il file del database esistente (dalla memoria interna) alla memoria esterna senza richiedere alcun root.


come farlo? come posso creare un db in sdcard
Naveen Prince P

Questo metodo ti aiuterà a creare database su sd-card. Fornisci semplicemente un percorso per Fileindicare la scheda SD e sei a posto
waqaslam,

1

per accedere a questa cartella potrebbe essere necessario disporre dei diritti amministrativi.

quindi hai due opzioni: -

  1. eseguire il root del dispositivo e quindi provare ad accedere a questa cartella
  2. usa l'emulatore

ps: se stai utilizzando una delle due opzioni precedenti puoi accedere a questa cartella seguendo questi passaggi

apri la prospettiva DDMS -> il tuo dispositivo -> (seleziona Esplora file dalle opzioni della finestra di destra) seleziona pacchetto -> dati -> dati -> nome pacchetto -> file

e da lì puoi recuperare il tuo file


1

adb backupnon ha funzionato per me, quindi ecco cosa ho fatto (Xiaomi Redmi Note 4X, Android 6.0):
1. Vai su Impostazioni> Impostazioni aggiuntive> Backup e ripristino> Backup locali . 2. Tocca "Esegui backup" nella parte inferiore dello schermo. 3. Deseleziona i segni di spunta "Sistema" e "App". 4. Tocca il pulsante di divulgazione dei dettagli a destra della cella "App" per accedere alla schermata di selezione dell'app. 5. Selezionare l'app desiderata e toccare OK. 6. Una volta completato il backup, il file effettivo deve trovarsi in qualche modo. Il mio è stato trovato in / MIUI / backup / AllBackup / _FOLDER_NAMED_AFTER_BACKUP_CREATION_DATE_ . 7. Poi ho seguito i passi da questa risposta da per convertire effettivamente il file di backup (.bak nel mio caso) tar (duplicando dalla risposta originale): " a) Vai qui e scarica: https://sourceforge.net/projects/adbextractor/





RonTLV


b) Estrai il file scaricato e passare alla cartella in cui è stato estratto.
c) eseguirlo con i propri nomi file: java -jar abe.jar decomprimere c: \ Intel \ xxx.ab c: \ Intel \ xxx.tar
"


0

puoi copiare questo file db da qualche parte in eclipse explorer (es: sdcard o PC), e puoi usare sqlite per accedere e aggiornare questo file db.



0

Puoi anche provare a copiare il file nella cartella della scheda SD, che è una cartella pubblica, quindi puoi copiare il file sul tuo PC dove puoi usare sqlite per accedervi.

Ecco un po 'di codice che puoi usare per copiare il file da dati / dati in una cartella di archiviazione pubblica:

private void copyFile(final Context context) {
    try {
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();

        if (sd.canWrite()) {
            String currentDBPath =
                    context.getDatabasePath(DATABASE_NAME).getAbsolutePath();

            String backupDBPath = "data.db";

            File currentDB = new File(currentDBPath);
            File backupDB = new File(sd, backupDBPath);

            if (currentDB.exists()) {
                FileChannel src = new FileInputStream(currentDB).getChannel();
                FileChannel dst = new FileOutputStream(backupDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Manifesto:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />

Tutte le azioni per copiare il file non sono accessibili se il file non condivide l'autorizzazione in lettura ad altri
Steve Luck

0

Il database SQLlite è memorizzato sul telefono dell'utente ed è nascosto nel percorso:

/Data/Data/com.companyname.AppName/File/

hai 2 opzioni qui:

  1. puoi eseguire il root del tuo telefono in modo da avere accesso per visualizzare il tuo file db3 hidding
  2. questa non è una soluzione ma una soluzione. Perché non creare semplicemente una pagina di prova che visualizzi la tabella del database in essa usando lo stato 'select'.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.