需要哪些清单权限才能将文件复制到Android设备的内部区域?

3
我希望能够让用户选择将文件复制到Android设备的数据目录以及外部区域。请问我需要在清单文件中添加什么内容才能让我的应用程序将文件复制到内部区域呢?我计划将文件存储在 /data/data/your.app.package.name/myFiles 中。在代码中,File.DirInternal 将转换为该位置。如果我使用 File.DirRootExternal,则会进入 /mnt/sdcard,这不会导致应用程序崩溃。这就是我认为清单文件引起问题的原因。如果我使用 File.DirInternal,则会在此行崩溃:
mpTheMediaPlayer.Load(File.DirInternal, "114.mp3")

导致程序崩溃的代码如下:

' Http sub routines.
'-------------------
Sub JobDone(Job As String)

Select Job
    Case "Job1"

        If HttpUtils.IsSuccess(mp3Url) Then 
            Dim blnFolderMade As Boolean

            mp3 = HttpUtils.GetInputStream(mp3Url)

            timer1.Enabled = True

            Dim out As OutputStream
            out = File.OpenOutput(File.DirInternal,"114.mp3",False)
            File.Copy2(mp3, out)
            out.Close

            ProgressBarDownloading.Visible = False

            ToggleButtonPlayPause.Checked = True
            ToggleButtonPlayPause.Enabled = True
            blnCurrentPauseCheckedState = True
            blnCurrentPauseEnabledState = True

            mpTheMediaPlayer.Release
            mpTheMediaPlayer.Initialize2("")
            mpTheMediaPlayer.Load(File.DirInternal, "114.mp3")
            mpTheMediaPlayer.Play
        End If
End Select
End Sub

这是来自日志的错误信息:

Starting Job: Job1
** Service (httputilsservice) Create **
** Service (httputilsservice) Start **
main_jobdone (java line: 518)
java.io.IOException: Prepare failed.: status=0x1
at android.media.MediaPlayer.prepare(Native Method)
at anywheresoftware.b4a.objects.MediaPlayerWrapper.Load(MediaPlayerWrapper.java:79)
at quran.repeater.main._jobdone(main.java:518)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:113)
at anywheresoftware.b4a.BA.raiseEvent(BA.java:97)
at anywheresoftware.b4a.keywords.Common.CallSub4(Common.java:772)
at anywheresoftware.b4a.keywords.Common.CallSub2(Common.java:759)
at quran.repeater.httputilsservice._processnexttask(httputilsservice.java:180)
at quran.repeater.httputilsservice._response_streamfinish(httputilsservice.java:244)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:113)
at anywheresoftware.b4a.BA$1.run(BA.java:218)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3647)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
java.io.IOException: Prepare failed.: status=0x1
2个回答

3
请查看Android的“数据存储”文档,了解有关保存到内部存储的详细信息:Data Storage
如果你指的是以下路径:/data/data/your.app.package.name/myFiles,那么你不需要额外的权限。这只是常规写入内部存储。
如果你指的是外部存储(虽然它看起来不像),那么你需要的是:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

如果你真的想要访问的是 "/data/myApp/myFiles",那么不进行root权限的情况下是无法做到的。因为你没有访问 /data 文件夹的权限。

是的,我正在尝试将文件复制到/data/data/your.app.package.name/myFiles,但是出现了“准备失败”的错误。我想要复制一个用媒体播放器播放的文件。另外,我使用的设备已经取得了root权限,但我不确定用户的设备是否具有root权限。 - Emad-ud-deen
请更新您的原始帖子,包括您的代码和异常堆栈跟踪,我会查看一下。 - kabuko
谢谢回复。我已经更新了帖子,加上了代码和日志。 - Emad-ud-deen
1
似乎是MediaPlayer的问题,而不是存储问题。请参考这些其他帖子文章 - kabuko
感谢回复。看起来我需要坚持只使用File.DirRootExternal作为文件位置,因为它似乎是唯一一个mp3文件可以播放的位置,所以看起来媒体播放器不喜欢File.DirInternal位置。 - Emad-ud-deen

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

在内部存储或SD卡上写入的权限是相同的。 - dcanh121
非常感谢您的快速回复。我一会儿会尝试一下。 - Emad-ud-deen
6
他的问题涉及内部存储。您允许外部存储吗? - Dmitry Zaytsev
他指的是手机自带的默认存储空间(8GB/16GB/32GB),而不是SD卡。 - dcanh121
它允许我将文件复制到mnt/sdcard,但无法复制到data/myApp/myFiles。是否需要在清单文件中添加其他信息行? - Emad-ud-deen
你应该尝试这个:http://developer.android.com/guide/topics/data/data-storage.html#AccessingExtFiles - dcanh121

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接