2017-10-26 69 views
5

Dlatego chcę pobrać zasób ciągów z innej aplikacji. Ta aplikacja to Android PackageInstaller (prawdopodobnie aplikacja System), a ciąg, który chcę pobrać, ma wiele wersji językowych (kod źródłowy tutaj>Link). Więc Package Installer's katalog zasobów wygląda następująco:Odzyskaj zasób ciągu z innej aplikacji

enter image description here

Chcę odzyskać String permission_warning_template z folderu values (zdaję sobie sprawę, że Android będzie automatycznie określić aktualny język i przynieś mi wartość tego języka, ale ja może mylić się).

To są 2 metody, które napisałem (minimalny, kompletny i sprawdzalny przykład) i żaden z nich nie działa. Czy to możliwe? Jak to zrobić?

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"); 

    } 
} 

Dzięki.

+2

Nie widzę tego możliwego. Dlaczego po prostu nie dodasz tych zasobów do swojej własnej aplikacji? – gustyaquino

+0

To niemożliwe: aplikacje są piaskowane w systemie Android. Zobacz https://developer.android.com/training/articles/security-tips.html – Robert

Odpowiedz

3

Prawdę mówiąc, prawie rozwiązałeś swój problem. Ponieważ masz zasoby innej aplikacji odzyskane, musisz po prostu zadzwonić pod numer get{Something} na ten obiekt res, a otrzymasz dokładny zasób.

Więc próbowałem tej metody:

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

I got

Pozwól% 1 $ s do% 2 $ S?

Co jest dokładnie tym, czego szukasz.