android createTempFile 抛出权限被拒绝?
Posted
技术标签:
【中文标题】android createTempFile 抛出权限被拒绝?【英文标题】:android createTempFile throws permission denied? 【发布时间】:2011-04-09 07:15:25 【问题描述】:这很简单,但不起作用。我正在尝试创建一个临时文件(后来成为永久存储文件)以预览 MP3 文件。我尝试了以下后缀的以下变体,例如:
public class StudyFileIo extends Activity
private static final String TAG = "StudyFileIo";
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try
File tempFooFile = File
.createTempFile("foo", "dat");
Log.i(TAG, tempFooFile.getAbsolutePath());
catch (IOException e)
Log.e(TAG, e.toString());
e.printStackTrace();
日志:
09-07 11:25:20.299 E/StudyFileIo( 8859): java.io.IOException: Permission denied
09-07 11:25:20.299 W/System.err( 8859): java.io.IOException: Permission denied
09-07 11:25:20.299 W/System.err( 8859): at java.io.File.createNewFileImpl(Native Method)
09-07 11:25:20.299 W/System.err( 8859): at java.io.File.createNewFile(File.java:1160)
09-07 11:25:20.299 W/System.err( 8859): at java.io.File.createTempFile(File.java:1224)
09-07 11:25:20.299 W/System.err( 8859): at java.io.File.createTempFile(File.java:1182)
09-07 11:25:20.299 W/System.err( 8859): at com.mobibob.studyfileio.StudyFileIo.onCreate(StudyFileIo.java:25)
09-07 11:25:20.299 W/System.err( 8859): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
09-07 11:25:20.299 W/System.err( 8859): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
09-07 11:25:20.309 W/System.err( 8859): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
09-07 11:25:20.309 W/System.err( 8859): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
09-07 11:25:20.309 W/System.err( 8859): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
09-07 11:25:20.309 W/System.err( 8859): at android.os.Handler.dispatchMessage(Handler.java:99)
09-07 11:25:20.309 W/System.err( 8859): at android.os.Looper.loop(Looper.java:123)
09-07 11:25:20.309 W/System.err( 8859): at android.app.ActivityThread.main(ActivityThread.java:4627)
09-07 11:25:20.309 W/System.err( 8859): at java.lang.reflect.Method.invokeNative(Native Method)
09-07 11:25:20.309 W/System.err( 8859): at java.lang.reflect.Method.invoke(Method.java:521)
09-07 11:25:20.319 W/System.err( 8859): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876)
09-07 11:25:20.319 W/System.err( 8859): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
09-07 11:25:20.319 W/System.err( 8859): at dalvik.system.NativeStart.main(Native Method)
是否缺少一些 AndroidManifest.xml 设置(我使用的是默认清单)?
【问题讨论】:
【参考方案1】:您需要在应用程序拥有的目录中创建临时文件。您应该使用createTempFile(String prefix, String suffix, File directory)
,其中directory 是要写入临时文件的位置。您可以从Context.getFilesDir()
或Context.getDir(String name, int mode)
获取目录 的有效位置。
【讨论】:
谢谢马克。我曾尝试使用该目录的表单,但我仍然提供了一个我无权访问的目录 getCacheDirectory。你的建议奏效了。同时,我切换到 getBaseContext().openFileOutput(...)【参考方案2】:我认为您只是错过了在外部存储上写入的权限,因为默认情况下会在那里创建临时文件。 添加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
到您的清单,它应该可以工作。
【讨论】:
如果您尝试写入外部存储,这是正确的,但对于 OP,情况并非如此。 根据the Android docs的说法,18及以下版本仍需要此权限。<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
【参考方案3】:
即使在添加之后
【讨论】:
在我添加该行后,它不会编译说错误:处理清单失败。以上是关于android createTempFile 抛出权限被拒绝?的主要内容,如果未能解决你的问题,请参考以下文章