1

我有一個列表,其中包含可以處理我的兩個操作Intent.ACTION_PICKMediaStore.ACTION_IMAGE_CAPTURE中的任何一個的應用程序。後來我用一個數組適配器來填充我的listivew與這個列表中的信息。無法從ResolveInfo實例獲取意圖過濾器

在我的onItemClickListener中,能夠從ResolveInfo實例中獲得ActivityInfoComponentName但我不能夠從ResolveInfo企圖得到它拋出NullPointerException異常),然而任何應用程序,在我的名單MUST HAVE解決我的意圖之一它是LN的獲得IntentFilter實例名單

這是投擲線NullPointerException異常IntentFilter filter = launchable.filter;

private void acquirePicture(){ 

ListView lv=(ListView)dialog.findViewById(R.id.listView1); 

PackageManager pm=getPackageManager(); 

List<ResolveInfo> launchables=pm.queryIntentActivityOptions(
this.getComponentName(),new Intent[]{takePicture}, 
photoPickerIntent,0); 

Collections.sort(launchables, 
     new ResolveInfo.DisplayNameComparator(pm)); 

appAdapter=new AppAdapter(pm, launchables); 

lv.setAdapter(adapter); 
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, 
          long arg3) { 
     // TODO Auto-generated method stub 
     ResolveInfo launchable=appAdapter.getItem(position); 
     ActivityInfo activity=launchable.activityInfo; 
     ComponentName name=new ComponentName(activity.applicationInfo.packageName, 
       activity.name); 

IntentFilter filter = launchable.filter; 
      if(filter.actionsIterator() != null){ 
       Iterator<String > actions = filter.actionsIterator(); 
      } 

      int actioncode; 
      Intent intent = new Intent(); 
      Uri uri; 
      if(filter.hasAction(Intent.ACTION_PICK)){ 
       actioncode = 1; 
       uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
       intent.setData(uri); 
      }else{ 
       actioncode = 0; 
      } 
      intent.setComponent(name); 
      startActivityForResult(intent,actioncode); 

    } 
}); 

} 

class AppAdapter extends ArrayAdapter<ResolveInfo> { 
private PackageManager pm=null; 

AppAdapter(PackageManager pm, List<ResolveInfo> apps) { 
    super(Custom_chooser.this, R.layout.row, apps); 
    this.pm=pm; 
} 

@Override 
public View getView(int position, View convertView, 
        ViewGroup parent) { 
    if (convertView==null) { 
     convertView=newView(parent); 
    } 

    bindView(position, convertView); 

    return(convertView); 
} 

private View newView(ViewGroup parent) { 
    return(getLayoutInflater().inflate(R.layout.row, parent, false)); 
} 

private void bindView(int position, View row) { 
    TextView label=(TextView)row.findViewById(R.id.label); 

    label.setText(getItem(position).loadLabel(pm)); 

    ImageView icon=(ImageView)row.findViewById(R.id.icon); 

    icon.setImageDrawable(getItem(position).loadIcon(pm)); 
} 
} 

問題1 on

如何獲取所選應用程序在我的onClickListner正文中解析的意圖?

回答

1

你需要明確地說你想要過濾器返回。相反的:

List<ResolveInfo> launchables=pm.queryIntentActivityOptions(
    this.getComponentName(), 
    new Intent[]{takePicture}, photoPickerIntent, 0); 

使用此:

List<ResolveInfo> launchables=pm.queryIntentActivityOptions(
    this.getComponentName(), 
    new Intent[]{takePicture}, photoPickerIntent, 
    PackageManager.GET_RESOLVED_FILTER); 

我沒有實際測試過這一點。請注意,返回IntentFilter s有很多錯誤和缺失功能。在許多情況下,這些文檔都是錯誤的,在很多情況下,代碼並沒有達到你期望的效果,並且沒有很多好的工作示例。

試試這個,讓我們知道它是否有效。

+0

我真的不明白'queryIntentActivityOptions()'的第二個和第三個參數,我所做的是猜測工作。我沒有從Android文檔中理解他們,因爲甚至沒有例子。你明白這個方法嗎? –

+0

爲答案,這是完美的。運作良好。我非常感謝你的幫助。我沒有很好地理解'queryIntentActivityOptions()**中的第三個參數,這就是爲什麼我要把零**。請給我反饋我以前的評論(上面的一個)。 –

+1

默認情況下,「ResolveInfo」的某些字段未被填充;必須使用'GET_'常量來請求它們。 –