2011-11-10 25 views
1

我真的不明白髮生了什麼,也許你可以給我一個主意。我使用getInstalledPackages()以獲取所有用戶安裝的應用程序及其權限的列表。下面是我該怎麼做:AsyncTask和getInstalledPackages()失敗

private PackageManager pm; 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     pm = getPackageManager(); 
     getListData(); 
} 

private void getListData() 
    { 

     backTask = new BackTask(); 
     backTask.execute(); 
    } 

protected class BackTask extends AsyncTask<Context, String, ArrayList<App>> 
    { 
.... 
     @Override 
     protected ArrayList<App> doInBackground(Context... param) 
     { 

       try { 

         //get a list of installed apps. 
          List<PackageInfo> packages = pm.getInstalledPackages(PackageManager.GET_PERMISSIONS | PackageManager.GET_PROVIDERS); 

          for (PackageInfo packageInfo : packages) { 
           ApplicationInfo application = packageInfo.applicationInfo; 
.... 
} 

我需要刷新基於用戶交互顯示的列表。這個問題在此行中出現的AsyncTask:

List<PackageInfo> packages = pm.getInstalledPackages(PackageManager.GET_PERMISSIONS | PackageManager.GET_PROVIDERS); 

有時包含所有安裝的應用程序有時是空的。比方說,例如3次,第三次是空的。從AsyncTask中取出這些代碼並將其放在getListData()上,每次都可以正常工作,沒有任何問題。問題是我得到了一點凍結,因爲操作不在後面的線程上。 那麼AsyncTask的處理是什麼?難道我做錯了什麼 ?

回答

0

檢查出類似的問題here,CommonsWare認爲這種方法需要在UI線程中涉及,據我所知,這是唯一合理的解釋。

+0

請檢查我的其他答案,我不認爲它需要在UI線程上執行,請參閱:http://stackoverflow.com/questions/3455781/packagemanager-getinstalledpackages-returns-empty-list – darken

1

基本上,這個異常被固定在Android 5.1(或至少這是我在什麼地方讀),但對於5.1之前,你需要做你自己的東西。

您可以通過使用shell避免此異常的崩潰和獲取安裝的應用程序的完整列表,我在這裏表示:

https://code.google.com/p/android/issues/detail?id=172058

下面的代碼:

public static List<PackageInfo> getInstalledPackages(Context context,int flags) 
    { 
    final PackageManager pm=context.getPackageManager(); 
    //if it's Android 5.1, no need to do any special work 
    if(VERSION.SDK_INT>=VERSION_CODES.LOLLIPOP_MR1) 
     return pm.getInstalledPackages(flags); 
    //else, protect against exception, and use a fallback if needed: 
    try 
     { 
     return pm.getInstalledPackages(flags); 
     } 
    catch(Exception ignored) 
     { 
     //we don't care why it didn't succeed. We'll do it using an alternative way instead 
     } 
    // use fallback: 
    Process process; 
    List<PackageInfo> result=new ArrayList<>(); 
    BufferedReader bufferedReader=null; 
    try 
     { 
     process=Runtime.getRuntime().exec("pm list packages"); 
     bufferedReader=new BufferedReader(new InputStreamReader(process.getInputStream())); 
     String line; 
     while((line=bufferedReader.readLine())!=null) 
     { 
     final String packageName=line.substring(line.indexOf(':')+1); 
     final PackageInfo packageInfo=pm.getPackageInfo(packageName,flags); 
     result.add(packageInfo); 
     } 
     process.waitFor(); 
     } 
    catch(Exception e) 
     { 
     e.printStackTrace(); 
     } 
    finally 
     { 
     if(bufferedReader!=null) 
     try 
      { 
      bufferedReader.close(); 
      } 
     catch(IOException e) 
      { 
      e.printStackTrace(); 
      } 
     } 
    return result; 
    }