Добавление полного разрешения для файла изображения в Android. - PullRequest
0 голосов
/ 27 марта 2012

Я использую следующий код для добавления полного разрешения для файлов изображений в Android. Этот код не работает каждый раз. Представьте, что есть три файла изображений: A.png, B.png и C.png. При некоторых условиях весь файл получит полное разрешение. В некоторых условиях A.png получит и в некоторых условиях получит или A и B получат полное разрешение. Я не смог найти причину. Пожалуйста, помогите мне найти причину.

String iconFile = themePrefs.getString(info.activityInfo.name, ""); // Icon file = "/data/data/com.android.settings/MyApp/A.png";
System.out.println("FileExecute " + ico.canExecute());     //always false
System.out.println("FileRead " + ico.canRead());           //always false
System.out.println("FileWrite " + ico.canWrite());         //always false
System.out.println("FileExists " + ico.exists());          //always true
System.out.println("FileisFile " + ico.isFile());          //always true
System.out.println("FileisDirectory " + ico.isDirectory());//always false

Drawable d = null;
FileInputStream fis; // in stream
try {
    File ico = new File(iconFile); //creating a file with the path (because only this is working with absolute path)
    try {
         Runtime.getRuntime().exec("chmod 777 " + iconFile);   
    } catch (IOException e1) {
     // TODO Auto-generated catch block
                        e1.printStackTrace();
    }
    System.out.println("FileExecute " + ico.canExecute());      // Sometimes getting true, Sometimes false 
    System.out.println("FileRead " + ico.canRead());            // Sometimes getting true, Sometimes false
    System.out.println("FileWrite " + ico.canWrite());          // Sometimes getting true, Sometimes false
    System.out.println("FileExists " + ico.exists());           // always true
    System.out.println("FileisFile " + ico.isFile());           // always true
    System.out.println("FileisDirectory " + ico.isDirectory()); // always false
}
catch (OutOfMemoryError e) {
    e.printStackTrace();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} catch(NullPointerException ne) {
    ne.printStackTrace();
}

1 Ответ

6 голосов
/ 27 марта 2012

Если у вас нет прав на чтение и запись из контекста, который вы используете, вы не сможете выполнять chmod из того же контекста. Измените на суперпользователя (su. Для этого устройство должно быть рутировано), а затем вы можете изменить режим. Вот код Оно работает. Я проверял это. Спасибо

void gainRoot()
{
    Process chperm;
    try {
        chperm=Runtime.getRuntime().exec("su");
          DataOutputStream os = 
              new DataOutputStream(chperm.getOutputStream());
            os.writeBytes("chmod 777 /data/data/com.android.settings/MyApp/A.png\n");
            os.flush();
            os.writeBytes("chmod 777 /data/data/com.android.settings/MyApp/B.png\n");
            os.flush();
            os.writeBytes("chmod 777 /data/data/com.android.settings/MyApp/C.png\n");
            os.flush();

              os.writeBytes("exit\n");
              os.flush();

              chperm.waitFor();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Точно используйте код и проверьте, рутировано ли ваше устройство Это должно сработать. Вызовите gainRoot () из oncreate (). Дайте мне знать, если у вас возникнут трудности. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...