相关疑难解决方法(0)

尝试将文件写入Android中的SD卡时,FileNotFoundException(权限被拒绝)

正如你可以从标题中注意到的那样,我在Android中将文件写入sdcard时遇到了问题.我已经检查了这个问题,但它没有帮助我.我想写一个将在sdcard上的公共空间中的文件,以便任何其他应用程序都可以读取它.

首先,我检查是否安装了SD卡:

Environment.getExternalStorageState();
Run Code Online (Sandbox Code Playgroud)

然后,我运行此代码:

File baseDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
    baseDir.mkdirs();
    File file = new File(baseDir, "file.txt");
    try {
        FileOutputStream out = new FileOutputStream(file);
        out.flush();
        out.close();
        Log.d("NEWFILE", file.getAbsolutePath());
    } catch (IOException e) {
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

我有:

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

<application>
...
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

在我的AndroidManifest.xml中.

确切的错误是这样的:

java.io.FileNotFoundException: /storage/1510-2908/Download/secondFile.txt: open failed: EACCES (Permission denied)
Run Code Online (Sandbox Code Playgroud)

我正在模拟器上测试我的代码(模拟Nexus5 API 23).我所需的最低SDK版本是19(4.4 Kitkat).


此外,一切正常,使用相同的代码将文件写入SD卡上的私人文件夹,所以我说前代码也应该工作:

File newFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "esrxdtcfvzguhbjnk.txt");
    newFile.getParentFile().mkdirs();
    try {
        FileOutputStream out = new FileOutputStream(newFile);
        out.flush();
        out.close();
        Log.d("NEWFILE", newFile.getAbsolutePath());
    } catch (IOException e) …
Run Code Online (Sandbox Code Playgroud)

java android filenotfoundexception android-permissions

17
推荐指数
1
解决办法
3万
查看次数

为什么Application有时会在killProcess上重启?

通常,通过调用退出我的应用程序:

android.os.Process.killProcess(android.os.Process.myPid());
Run Code Online (Sandbox Code Playgroud)

表现良好而没有事故.

但每隔一段时间,应用程序将重新启动(退出后!).

相关的日志片段显示:

.631: I/Process(15495): Sending signal. PID: 15495 SIG: 9
.641: W/AudioFlinger(121): write blocked for 252 msecs, 1279 delayed writes, thread 0xdc18
.651: I/ActivityManager(164): Process com.ef.myapp (pid 15495) has died.
.651: I/WindowManager(164): WIN DEATH: Window{463659e8 com.ef.myapp/com.ef.myapp.MainActivity paused=false}
.661: I/AudioService(164):  AudioFocus  abandonAudioFocus() from android.media.AudioManager@460b2b98
.701: I/ActivityManager(164): Start proc com.ef.myapp for activity com.ef.myapp/.MainActivity: pid=15589 uid=10077 gids={3003}
Run Code Online (Sandbox Code Playgroud)

我知道,通过Android OS的设计,killProcess()不是终止应用程序的正确方法.这是因为killProcess()会立即停止进程,而不会给予应用程序阻止或准备它的任何方式或机会.

我知道当我调用finish()时,应用程序堆栈只是被推到后台(并且仍然存在于内存中).Android本身决定何时关闭应用程序(即从内存中删除其实例),通常这是在应用程序变为"最长时间未使用的最长时间"时完成的.如果它真的是最后一个,它的行为实际上更容易预测.

问题是finish()只会停止并销毁调用它的活动.它不会阻止应用程序或其他活动产生的其他活动.因此,为了便于在开发过程中进行测试和调试,我使用 killProcess()作为方便的快捷方式.

但是现在我看到这有副作用,有时候会在自杀之后立即重新启动 - …

android activity-lifecycle android-windowmanager android-activity

10
推荐指数
1
解决办法
6902
查看次数