ChatGPT解决这个技术问题 Extra ChatGPT

如何访问 Android 设备中的数据/数据文件夹?

我正在开发一个应用程序,我知道我的数据库 *.db 将出现在 data/data/com.****.***

我可以在 sqlite manager 的帮助下从 Eclipse 中的 AVD 访问这个文件

但我无法在我的 Android 手机中访问此文件。我用谷歌搜索它,它说我需要root我的手机才能做到这一点,但我不想这样做。

如何在我的 Android 手机中访问我的 data/data/..... 目录“无需 root ”?

我可以更改目录 data/data..... 的用户权限而不使用它吗?

你有database.db文件吗..???
我正在使用数据库 - “openOrCreateDatabase(....)”
您肯定首先需要root手机。然后,您将需要一个可以使用的称职的文件管理器应用程序。 ASTRO 文件管理器很受欢迎,但它没有 root 访问支持,因此对于高级用户来说毫无用处。您应该能够使用 ES File Explorer 或 File Expert。我最近在使用 ES 文件资源管理器查看 /data/data 或其他受保护的文件夹时遇到问题并且几乎放弃了它,我现在正在使用文件专家。它们都要求您进入设置并启用根资源管理器选项(有时还需要将文件系统挂载为可写)。所以你需要先这样做。
这不是与编程相关的问题或答案。

T
THelper

直接在手机上访问文件很困难,但您可以将它们复制到您的计算机上,在那里您可以做任何您想做的事情。如果不生根,您有两种选择:

如果应用程序是可调试的,您可以使用 adb shell 中的 run-as 命令 adb shell run-as com.your.packagename cp /data/data/com.your.packagename/ 或者您可以使用 Android 的备份功能。 adb backup -noapk com.your.packagename 现在将提示您“解锁您的设备并确认备份操作”。最好不要提供密码,否则读取数据变得更加困难。只需单击“备份我的数据”。您计算机上生成的“backup.ab”文件包含 android 备份格式的所有应用程序数据。基本上它是一个压缩的 tar 文件。本页解释了如何使用 OpenSSL 的 zlib 命令解压缩它。您可以使用 adb restore backup.db 命令恢复备份。


adb backup -f \location\on\local\drive -noapk app.package.name 在没有 root 的情况下为我工作
使用此命令解压缩您的备份文件:dd if=backup.ab bs=24 skip=1|openssl zlib -d > backup.tar
在选项 1 中,如何告诉 cp 命令将它们保存到我的笔记本电脑(Mac)?如果你举一个Win的例子,我也想知道,只是翻译一下。谢谢。
重要提示:运行 adb backup -noapk com.your.packagename 会将 ab 文件保存在 当前目录 中,因此请确保您已导航到正确的目录(例如 cd Desktop..
请注意,如果您的应用已通过清单中的 android:allowBackup="false" 禁用备份,则备份方法将产生一个空备份。
S
Shahidul

如果您使用的是 Android Studio 3.0 或更高版本,请按照以下步骤操作。

单击视图 > 工具窗口 > 设备文件资源管理器。展开 /data/data/[package-name] 节点。

您只能扩展在非 root 设备上以调试模式运行的软件包。

https://i.stack.imgur.com/OMdpq.jpg


我在这个码头看不到任何东西。说我什么都没有。你知道什么问题吗?
这仅适用于调试模式,不适用于发布版本
感谢您展示了查看文件系统的无皮塔方法!
这太棒了。希望我不久前就知道这一点。
对于那些想知道的人,路径通常类似于:/data/user/0/[package.name]
S
Sheraz Ahmad Khilji

您也可以尝试使用根资源管理器应用程序获取数据库。如果这不起作用,那么你可以试试这个:

打开 cmd 更改目录并进入“平台工具”类型“adb shell”su 在设备上按“允许” chmod 777 /data /data/data /data/data/com.application.package /data/data/com.application .package/* 在 Eclipse 中打开 DDMS 视图,然后从那里打开“FileExplorer”以获取您想要的文件

在此之后,您应该能够浏览根设备上的文件。


我认为 root explore 应用程序仅适用于有 root 权限的手机。我会尝试第二种方法
无法 chmod /data:不允许操作
@bofredo 我认为这是因为您的手机没有植根。你应该root你的手机然后试试这个
@mahemadhi 是的,您可能必须为每个目录手动运行此命令,因为所有目录都具有它们私有的权限。
@VivekChavda 是的,他们需要有根电话
A
Anirudh Ramanathan

要执行上述任何操作(即从手机本身访问受保护的文件夹),您仍然需要 root。 (这包括更改 /data 文件夹的挂载权限并访问它)

如果没有 root,则无法通过代码直接访问 /data 以读取 您的 应用程序中的除外。因此,您可以尝试将该文件复制到 sdcard 或可访问的地方,然后,您应该能够正常访问它。

如果您拥有开发人员设备,则生根不会使您的保修失效。对不起,AFAIK 没有其他方法。


我没有使用开发人员设备。我的是 Xperia U
我可以使用 chmode 命令编辑数据文件夹的用户权限吗?
整个分区以只读方式挂载。我会说您最好的选择是adb pull,如下面的答案中所述。
如果应用程序允许,我是可能的。这些目录对每个人都有 x 权限(但对每个人都没有 r,所以你必须知道路径)。这取决于应用程序是否使文件世界可访问。有些文件是,大多数不是。
首先您说无法阅读,然后您建议将文件复制到其他地方。但是,如何在不读取文件的情况下复制文件?我认为这个答案有问题。
A
Alex P.

在无根的 Android 5.0+ 设备上从可调试应用程序文件夹(比如说 /data/data/package.name/databases/file)中提取文件的最简单方法(只需一个简单步骤)是使用以下命令:

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

L
Leos Literak

打开命令提示符 将目录更改为 E:\Android\adt-bundle-windows-x86_64-20140702\adt-bundle-windows-x86_64-20140702\sdk\platform-tools 输入以下命令 adb -d shell run-as com.your .packagename cat databases/database.db > /sdcard/database.db 将目录更改为 cd /sdcard 以确保 database.db 在那里。 adb pull /sdcard/database.db 或者你可以从 device 复制 database.db 。


非常适合我。谢谢!但就我而言,数据库文件名没有 .db 扩展名。
N
Nguyen Minh Binh

在 Eclipse 中使用文件资源管理器。选择 Windows => 显示视图 => 其他 ... => 文件资源管理器。

另一种方法是通过 adb 拉取文件:

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

R
RonTLV

从 Android 备份到桌面

打开命令行 cmd 并运行:adb backup -f C:\Intel\xxx.ab -noapk your.app.package。不要输入密码,然后单击备份我的数据。确保不要保存在驱动器 C 根目录上。你可能会被拒绝。这就是我保存在 C:\Intel 上的原因。

提取 *.ab 文件

去这里下载:https://sourceforge.net/projects/adbextractor/ 提取下载的文件并导航到您提取的文件夹。使用您自己的文件名运行它: java -jar abe.jar unpack c:\Intel\xxx.ab c:\Intel\xxx.tar


这是一个很好的答案,谢谢。为我提取了在小米设备上创建的单个应用程序备份(扩展名为 .bak)。无需生根
K
Khairul Alam Licon

我曾经也遇到过同样的问题。除了 adb shell 或 root 设备外,无法直接访问 android 设备中的文件。

旁边还有 02 个选项:

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) 试试这个:https://github.com/sanathp/DatabaseManager_For_Android


l
lol2dubs

在有根设备上,正确的解决方案是:

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

原始解决方案有效,但 chmod 将返回未知目录。将 chmod 命令更改为 /data/data/* 可以从 Intellij 中的 DDMS 访问数据目录中的所有子文件夹。我假设 Eclipse DDMS 也有同样的解决方案。

更新所以,我发现很奇怪。我在 IntelliJ(Android 设备监视器)中使用 DDMS 运行 Nexus 6。我已经构建了一个小的入门应用程序。所述应用程序将数据保存到 data/data/com.example.myapp/files 中的 .csv 文件

当我第一次开始尝试在我的 Nexus 6 上访问这个文件时,我发现我必须 root 设备.. 我可以看到数据文件夹,但尝试打开它是行不通的。正如其他地方在网上提到的那样,expand + 会消失,然后很快就会重新出现(注意,网上有一些解决方案声称允许在不生根的情况下访问这些文件夹,我直到为时已晚才找到它们,我不确定我是否不想root((我宁愿能够手动完成,而不是依靠应用程序或命令提示符来给我我的解决方案)))。我植根了我的 6 并再次尝试了 DDMS。

此时,它向我显示了数据文件夹,我可以展开文件夹并查看 com.目录,但我无法打开其中任何一个。那是我发现上述解决方案的时候。初始说明不适用于这部分:

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

那是我尝试发布的解决方案时:

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

该解决方案似乎有效,但仅适用于某些文件夹。我现在可以展开 myapp 文件夹,但无法展开其中的 files 目录。

在这一点上,我玩了一会儿,然后想为什么不在我需要的目录上尝试它而不是尝试这些通配符条目。

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

其次是:

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

这些命令允许我展开并查看我的应用程序目录中的文件,以确认 .csv 已正确保存。

希望这可以帮助某人。我为此挣扎了好几个小时!

(更进一步,奇怪的是,权限没有传递给传递给文件目录的 .csv 文件。我的文件目录权限读取 drwxrwxrwx 和我的 log.csv 文件权限读取 -rw-rw--- - .. 仅供参考)


J
Jayanth

可能是要访问这个文件夹你需要管理权限。

所以你有两个选择: -

根您的设备,然后尝试使用模拟器访问此文件夹

ps:如果您使用以上两个选项中的任何一个,您可以按照以下步骤访问此文件夹

打开 DDMS 透视图 -> 您的设备 ->(从右侧窗口选项中选择文件资源管理器)选择包 -> 数据 -> 数据 -> 包名称 -> 文件

从那里你可以提取你的文件


我使用逍遥安卓模拟器。
s
suther

您可以像这样下载一个文件:

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

在下载之前,您可能不想查看 App-Directory 中的文件结构。为此,请执行上面提到的以下步骤 THelper

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

Android-Studio 方式Shahidul (https://stackoverflow.com/a/44089388/1256697) 也可以使用。对于那些在菜单中没有看到 DeviceFile Explorer 选项的用户:请务必在 Android Studio 中打开 /android-Directory。例如,react-native 用户在其 Project-Folderinside 中与 /ios-Directory 处于同一级别。


R
Russian

adb backup 对我不起作用,所以我做了以下操作(小米红米 Note 4X,Android 6.0):
1. 转到 设置 >附加设置 >备份与重置>本地备份
2. 点击屏幕底部的“备份”。
3. 取消选中“系统”和“应用”复选标记。
4. 点击屏幕上的详细信息披露按钮在“应用程序”单元格右侧导航到应用程序选择屏幕。
5. 选择所需的应用程序并点击确定。
6. 备份完成后,需要以某种方式找到实际文件。我的可以在 /MIUI/backup/AllBackup/_FOLDER_NAMED_AFTER_BACKUP_CREATION_DATE_ 找到。
7. 然后我按照 this answerRonTLV 的步骤实际转换了备份文件(我的案例)到 tar(从原始答案复制):
"
a) 转到此处下载:https://sourceforge.net/projects/adbextractor/
b) 解压缩下载的文件并导航到您解压缩的文件夹。
c ) 使用您自己的文件名运行它: java -jar abe.jar unpack c:\Intel\xxx.ab c:\Intel\xxx.tar
"


w
waqaslam

一种简单的方法是在 SD 卡上创建数据库。因为您无法访问手机内部存储器中的数据文件夹,除非您对手机进行 root。那么为什么不简单地在 SD 卡上创建您的数据库。

此外,如果您愿意,您可以编写一些文件复制代码来将现有的数据库文件(从内部存储器)复制到外部存储器,而无需任何根。


怎么做?如何在 sdcard 中创建数据库
This 方法将帮助您在 sd 卡上创建数据库。只需提供指向 SD-Card 的 File 路径即可
N
Nirmal

简单的答案是否定的。在即将推出的 Android 13 上,如果没有 Root 设备或连接到 PC,您将无法访问 /storage/emulated/0/Android/* 目录中的任何内容,当然在 Pixel 设备中也不行。

在此处阅读 Android 源页面以了解使用 ADB 进行此类应用数据访问:https://developer.android.com/training/data-storage/manage-all-files


V
Vito

您可以将此 db 文件复制到 eclipse explorer 中的某个位置(例如:sdcard 或 PC),您可以使用 sqlite 访问和更新此 db 文件。


l
live-love

您也可以尝试将文件复制到 SD 卡文件夹,这是一个公共文件夹,然后您可以将文件复制到您的 PC,您可以使用 sqlite 访问它。

以下是一些可用于将文件从 data/data 复制到公共存储文件夹的代码:

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

显现:

<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" />

如果文件不与其他人共享读取权限,则无法访问复制文件的所有操作
佚名

SQLlite 数据库存储在用户的手机上,它隐藏在路径下:

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

你有两个选择:

您可以根您的手机,以便您可以访问查看隐藏的 db3 文件,这不是解决方案,而是解决方法。为什么不使用“选择”语句创建显示数据库表的测试页面。


T
Tonio FERENER - VARI

问题是:如何在 Android 设备中访问数据数据文件夹?

如果 android-device 是 Bluestacks * Root Browser APK 显示 data/data/..

尝试从 https://apkpure.com/root-browser/com.jrummy.root.browserfree 下载根浏览器

如果文件是文本文件,您需要点击“打开为”、“文本文件”、“打开为”、“RB 文本编辑器”