2012-03-27 14 views
0

我正在使用以下代碼爲Android中的圖像文件添加完整權限。 此代碼並非每次都有效。想象一下,有三個圖像文件,A.png,B.png和C.png。在某些情況下,所有文件都將獲得完整權限。在某些情況下,A.png會得到並在某些情況下獲得,或者A和B將獲得完全許可。我無法找到原因。請幫我找出原因。在android中添加對圖像文件的完整權限。

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(); 
} 

回答

6

如果您沒有讀取,正在運行的上下文中寫入權限,您將無法從同一上下文執行chmod。切換到超級用戶(su。爲此,設備必須是root的),然後你可以改變模式。這是代碼。有用。我測試了它。謝謝

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(); 
    } 
} 

準確地使用該代碼並檢查您的設備是否已生根。它應該工作。從oncreate()調用gainRoot()。如果您有任何困難,請告訴我。謝謝

+0

分享,如果它爲你工作..謝謝.. – 2012-03-27 06:45:35

+0

即使改變後,我得到同樣的例外。請參閱日誌 BEF ICO:/data/data/my.pack/app/A.png BEF ico.canExecute():假 BEF ico.canRead():假 BEF ico.canWrite():假 Bef ico.exists():true **執行代碼後** ico:/data/data/my.pack/app/A.png ico.canExecute():false ico.canRead() :false ico.canWrite():false ico.exists():true java.io.FileNotFoundException:/data/data/com.android.settings/app_themes/Settings.png:open failed:EACCES(Permission denied) – Kamalone 2012-03-27 08:13:13

+0

是您正在測試的設備的根源?在我的代碼中,我給出的路徑是/dev/A.png。 Pease將其更改爲/data/A.png或者其中的任何路徑。我想你會這樣做的。但提及它只是爲了確認 – 2012-03-27 08:34:05

相關問題