以编程方式将文件保存在 Android 设备上

Programmatically saving a file on an Android device

我正在编写一些 UI 测试,我需要能够让这些测试以编程方式在某些点截取我的应用程序的屏幕截图。我什至不确定如何从 UI 测试中截取屏幕截图,但我已经弄清楚了,并且稍微修改了一些我在网上找到的代码以用于我的目的。据我所知,截图的代码工作得很好;但是,我截屏后好像无法保存。

我找到的代码似乎使用以下步骤来保存屏幕截图。当然,就像我说的那样,它不起作用,但这可能是因为我的设备是 Nexus 7,并且根据我读到的内容,该设备上的存储工作方式与其他 Android 设备不同,尽管 none 我所看到的资源已经非常详细地涵盖了这种差异。

String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + theFileName;
File imageFile = new File(path);

下一位在 try-catch 块中,此时程序抛出 FileNotFound 异常。

out = new FileOutputStream(imageFile);

("out" 是一个 FileOutputStream)

我假设 Environment.getExternalStorageDirectory().getAbsolutePath() 没有返回正确的路径或其他东西。我也试过 .getPath 而不是,但这也不起作用。我在定义out之前查看了imageFile的文件路径是什么,是“/storage/emulated/0/screenname”(其中screenname就是代码中的文件名)

我需要将屏幕截图保存在设备上的某个地方。在哪里并不重要,只要我可以从我的计算机访问它,但我希望我能以这种方式编写代码,这样我就可以 运行 在任何设备上运行该程序而无需重写确定路径的代码。如果那不可能,我希望它至少可以在我的 Nexus 7 上运行。

任何关于我如何做到这一点的建议都将不胜感激。谢谢!

编辑:清单文件

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

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName=".MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.john.johntest.MainActivity" />
    </activity>
</application>

将 WRITE_EXTERNAL_STORAGE 权限请求放入您的清单文件中。