【问题标题】:Permissions on phone while debugging?调试时对手机的权限?
【发布时间】:2012-05-20 04:50:35
【问题描述】:

我正在实施一种备份方法来将应用数据库复制到 SDCard。

这在模拟器中运行良好,但是当我尝试在手机上运行它时,它会崩溃。以下是相关的堆栈跟踪:

W/KeyCharacterMap(15814): Can't open keycharmap file
W/KeyCharacterMap(15814): Error loading keycharmap file '/data/usr/keychars/tegra-kbc.kcm.bin'.     hw.keyboards.0.devname='tegra-kbc'
W/System.err(15814): java.io.FileNotFoundException: /mnt/sdcard/GroceryList.bak (Permission denied)
W/System.err(15814):    at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
W/System.err(15814):    at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
W/System.err(15814):    at java.io.FileOutputStream.<init>(FileOutputStream.java:94)
W/System.err(15814):    at java.io.FileOutputStream.<init>(FileOutputStream.java:66)

我的第一个想法是权限(由于堆栈跟踪中的权限被拒绝),但我仔细检查了我的清单,它确实包含:

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

如果是方法中的东西:

public void backup() {
    try {
        File sdcard = Environment.getExternalStorageDirectory();
        File outputFile = new File(sdcard,
                "GroceryList.bak");
        File data = Environment.getDataDirectory();
        File inputFile = new File(data,
                "data/cdc.workshopapps.grocerylist/databases/GroceryList");
        InputStream input = new FileInputStream(inputFile);
        OutputStream output = new FileOutputStream(outputFile);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = input.read(buffer)) > 0) {
            output.write(buffer, 0, length);
        }
        output.flush();
        output.close();
        input.close();
    } catch (IOException e) {
        e.printStackTrace();
        throw new Error("Copying Failed");
    }
}

除了从 Eclipse 运行程序之外,我还需要做什么才能在手机上启用该权限吗?

编辑

根据要求的整个清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cdc.workshopapps.grocerylist"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".GroceryListMain"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.NoTitleBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

如果重要的话,我正在使用的手机是摩托罗拉 Droid X2(它对我的上一期很重要,所以我想我会提到它)。

【问题讨论】:

  • java.io.FileNotFoundException - 那是你的问题
  • 嗯,当然不是……我正在尝试在那里创建它。 :p
  • 我的糟糕快速浏览没有看到(权限被拒绝)
  • Google 说不应该挂载 SD 卡,并且使用权限必须在 标签之外
  • 就是这样。插入 USB 时我无法执行此操作。请将此作为答案发布,以便我给予您信任。

标签: android android-sdcard android-file


【解决方案1】:

我的评论“Google 说不应该安装 SD 卡。”是根据 OP 的正确答案。

【讨论】:

    【解决方案2】:

    我认为您的问题是该文件不存在... 先尝试创建它:

     File outputFile = new File(sdcard, "GroceryList.bak");
     if (!outputFile.exists())
         outputFile.createNewFile();
    

    【讨论】:

    • 我会试一试......因为我在这里关注另一个答案,我认为我不必添加任何额外的东西。
    • 没用,虽然改了错误:W/System.err(17105): java.io.IOException: Permission denied 我不断返回权限,但我的清单中有所需的权限...
    • 粘贴您的 AndroidManifest.xml。问题可能出在您允许的地方
    • 正如 user1378730 所说,尝试将您的权限声明移到应用程序标签之外。
    • 我认为不存在的文件也可能是其中的一部分,所以 +1,尽管最终的答案是移除 USB 电缆。
    【解决方案3】:

    您确定该文件已经存在吗?有时只是创建文件对象(new File(..))并不会创建文件本身。如果 FileNotFoundException 正在发生意味着,那么文件还不存在。您可以通过调用 file.createNewFile() 来创建它。

     File f= new File(sdcard, "GroceryList.bak");
       if(!f.exists())
       f.createNewFile();
    

    【讨论】:

      猜你喜欢
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 2014-08-27
      • 2010-10-28
      • 2017-05-13
      • 2020-03-05
      相关资源
      最近更新 更多