【问题标题】:chmod failed: EPERM (Operation not permitted) in android?chmod 失败:Android 中的 EPERM(不允许操作)?
【发布时间】:2014-09-09 12:34:59
【问题描述】:

我想为此在 sdcard 或外部 sdcard 中创建数据库,我尝试了此代码并使用此代码我已成功在 sdcard 中创建数据库,但在 logcat 中它给了我如下警告

Logcat

07-18 14:18:22.140: W/FileUtils(8595): 失败 chmod(/mnt/sdcard/peakmedia/DB_PMD):libcore.io.ErrnoException:chmod 失败:EPERM(不允许操作)

DB_Helper.java

public class DB_Helper extends SQLiteOpenHelper
{

    public DB_Helper(Context context) 
    {   
        super(context, Environment.getExternalStorageDirectory().getAbsolutePath() 
                       + File.separator + DB_Constant.DB.FILE_DIR 
                       + File.separator + DB_Constant.DB.DATABASENAME, null, DB_Constant.DB.DB_VERSION);

    }

    @Override
    public void onCreate(SQLiteDatabase db) 
    {
        String  query=String.format(DB_Constant.CREATE_TABLE_QUERY.CREATE_MYFILES_TABLE);
        db.execSQL(query);


        query=String.format(DB_Constant.CREATE_TABLE_QUERY.CREATE_MYUSERS_TABLE);
        db.execSQL(query);

        query=String.format(DB_Constant.CREATE_TABLE_QUERY.CREATE_MYPLAYLIST_TABLE);
        db.execSQL(query);

        query=String.format(DB_Constant.CREATE_TABLE_QUERY.CREATE_MYDEVICE_TABLE);
        db.execSQL(query);

    }

     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
     {
            if(newVersion > oldVersion)
            {   

                db.execSQL("DROP TABLE IF EXISTS "+ DB_Constant.TABLE.MYFILES);
                onCreate(db);

                db.execSQL("DROP TABLE IF EXISTS "+ DB_Constant.TABLE.MYUSERS);
                onCreate(db);

                db.execSQL("DROP TABLE IF EXISTS "+ DB_Constant.TABLE.MYPLAYLIST);
                onCreate(db);

                db.execSQL("DROP TABLE IF EXISTS "+ DB_Constant.TABLE.MYDEVICE);
                onCreate(db);

            }
     }
}

【问题讨论】:

    标签: android android-sqlite


    【解决方案1】:

    刚刚解决了这个问题。

    您必须让您的应用加入 linux build 才能授予它 SYSTEM 权限。

    1. 将此行添加到 Android.mk 中

      LOCAL_CERTIFICATE := platform

    2. 将此添加到AndroidManifest.xml的清单节点中

      android:sharedUserId="android.uid.system"

    3. 生成apk并推送到/system/app/

    4. 现在你可以尝试运行了

      final String command = "chmod 777 /data/ena";
      Process p = Runtime.getRuntime().exec(command);
      

      或

      File file = new File("/data/ena");
      if (file.exists()) {
          boolean result = file.setExecutable(true);
          Log.e(TAG, "trpb67, RESULT IS " + result);
      }
      

      结果的值应该为真

    【讨论】:

      【解决方案2】:

      昨天我遇到了和 Mahesh 一样的问题(出现同样的警告信息,将数据从 SQL 服务器插入到 SQLite,2 个表应该在 SQLite 中接收数据,但只有 1 个表接收到数据,另一个表是空的)。

      但是今天我再次尝试将SQL server的数据插入SD卡中的2张SQLite表中,这次是2张表接收到数据。

      唯一的区别是 EMULATOR 设置。

      扩大SD卡空间设置,从几MB到8GB,参考图片。 emulator setting photo

      虽然也出现警告,但插入工作成功。

      【讨论】:

        【解决方案3】:

        检查您的设备是否以 MTP usb 模式连接。有时 MTP 模式的先前连接可能会导致此问题。只需重新启动设备并检查它是否正常工作。

        【讨论】:

          【解决方案4】:

          您必须更改此文件夹的所有者 (chown)。目前,应用程序/您不是您要安装数据库的文件夹的所有者。

          所以你必须做类似的事情

          sudo chown -R theuser /mnt/sdcard/peakmedia/DB_PMD
          

          【讨论】:

            猜你喜欢
            • 2020-04-12
            • 2019-10-09
            • 1970-01-01
            • 2021-01-01
            • 1970-01-01
            • 2021-12-03
            • 1970-01-01
            • 2023-02-07
            • 1970-01-01
            相关资源
            最近更新 更多