2017-10-26 24 views
5

Vì vậy, tôi muốn truy xuất tài nguyên chuỗi từ một ứng dụng khác. Ứng dụng là Android PackageInstaller (hầu hết có thể là ứng dụng System) và chuỗi Tôi muốn truy xuất có nhiều phiên bản ngôn ngữ (Mã nguồn ở đây>Link). Vì vậy, Package Installer's thư mục tài nguyên trông như thế này:Truy xuất tài nguyên chuỗi từ ứng dụng khác

enter image description here

Tôi muốn lấy String permission_warning_template từ thư mục values (Tôi nhận ra rằng Android sẽ tự động xác định ngôn ngữ hiện tại và sẽ lấy tôi giá trị của ngôn ngữ đó, nhưng tôi có thể sai).

Đây là 2 phương pháp tôi đã viết (Ví dụ tối thiểu, hoàn chỉnh và có thể xác minh) và không hoạt động. Thậm chí có thể không? Làm thế nào để hoàn thành nó?

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //First Try 
     testUseAndroidString(); 

     //Second Try 
     Resources res = null; 
     try { 
      res = getPackageManager().getResourcesForApplication("com.android.packageinstaller"); 
     } catch (PackageManager.NameNotFoundException e) { 
      e.printStackTrace(); 
     } 
     if(null != res) { 
      int sId = res.getIdentifier("com.android.packageinstaller:string/permission_warning_template", null, null); 

      if(0 != sId) { 
       Log.d("TagLet", res.getString(sId)); 
      } 
     } 
    } 

    public void testUseAndroidString() { 
     Context context = this; 
     Resources res; 
     try { 
      res = context.getPackageManager().getResourcesForApplication("com.android.packageinstaller"); 
      int resourceId = res.getIdentifier("com.android.packageinstaller:string/permission_warning_template", null, null); 
      if(0 != resourceId) { 
       CharSequence s = context.getPackageManager().getText("com.android.packageinstaller:string/permission_warning_template", resourceId, null); 
       Log.d("TagLet", "resource=" + s); 
      } 
     } catch (PackageManager.NameNotFoundException e) { 
      e.printStackTrace(); 
     } 
     Log.d("TagLet", "FAIL"); 

    } 
} 

Cảm ơn.

+2

Tôi không thấy điều đó có thể xảy ra. Tại sao bạn không chỉ đưa những tài nguyên đó vào ứng dụng của riêng mình? – gustyaquino

+0

Thats không thể: Ứng dụng được sandboxed trong Android. Xem https://developer.android.com/training/articles/security-tips.html – Robert

Trả lời

3

Vì vậy, bạn gần như đã giải quyết được vấn đề của mình. Vì bạn có tài nguyên của một ứng dụng khác được truy xuất lại, bạn chỉ cần gọi get{Something} trên đối tượng res này và bạn sẽ nhận được tài nguyên chính xác.

Vì vậy, tôi đã thử phương pháp này:

public void testUseAndroidString() { 
    Context context = this; 
    Resources res; 
    try { 
     res = context.getPackageManager().getResourcesForApplication("com.android.packageinstaller"); 
     int resourceId = res.getIdentifier("com.android.packageinstaller:string/permission_warning_template", null, null); 
     if(0 != resourceId) { 
      String s = res.getString(resourceId); 
      Log.d("TagLet", "resource=" + s); 
     } 
    } catch (PackageManager.NameNotFoundException e) { 
     e.printStackTrace(); 
    } 
} 

Và có

Allow% 1 $ s đến% 2 $ s?

Tôi đoán chính xác những gì bạn đang tìm kiếm.

Các vấn đề liên quan