2012-10-12 63 views
0

當我單擊某個文件時,「Open With」對話框中出現多個選項。這是因爲我用Action_VIEW發送了一個意圖,並且有多個應用程序可以接收它。在Android中創建自定義的「Open-With」對話框

intent.setAction(android.content.Intent.ACTION_VIEW); 
     Uri fileUri = Uri.parse("file://" + location); 

出於安全原因,我想禁用其中的一些,例如打印機應用程序用於從我的應用程序打開文件。

是否有一種機制來過濾選項或選擇要顯示的選項?

回答

0

如果知道應用程序名稱,可以使用SetPackage進行嘗試。例如,在你的代碼,你可以使用setPackage

intent.setAction(android.content.Intent.ACTION_VIEW); 
intent.setPackage("com.test.print"); 
Uri fileUri = Uri.parse("file://" + location); 
0

我回答我的問題指定包的名稱,因爲它可能有利於任何人尋找類似的東西。 因此,您可以如何自定義並創建您自己的「打開對話框」:

第1步:獲取要顯示的應用程序列表。爲此,您需要從意圖中篩選應用程序。

final Intent intent = new Intent(Intent.ACTION_VIEW); 

intent.setDataAndType(fileUri, mimeType); 


List<ResolveInfo> getAllAppswhichcanViewtheFile = (List<ResolveInfo>)getApplicationContext().getPackageManager().queryIntentActivities(intent, 0); 

    Iterator<ResolveInfo> i = getAllAppswhichcanViewtheFile .iterator(); 
    while (i.hasNext()) { 
     ResolveInfo file = i.next(); 

    // Use condition to filter the List 
     if (file.activityInfo.packageName.contains(XXXX)) { 
      i.next(); 
     } else {   
      i.remove(); 
     } 

     List<ResolveInfo> resolvedPrintList = getAllAppswhichcanViewtheFile ; 

步驟2:顯示篩選應用上的警報對話框:

 AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setTitle(DataUtils.getString(R.string.xyz)); 
     final OpenWithArrayList adapter = new OpenWithArrayList(this,   R.layout.basiclistview, R.id.text1, resolvedPrintList); 
     builder.setAdapter(adapter, new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 

       ResolveInfo info = (ResolveInfo)adapter.getItem(which);    

intent1.setClassName(info.activityInfo.packageName,info.activityInfo.name); startActivity(intent1);
} });

 builder.create(); 
     builder.show(); 

第3步:創建適配器: 公共類OpenWithArrayList擴展ArrayAdapter {

Context context; 
    Object[] items; 
    boolean[] arrows; 
    int layoutId; 





public OpenWithArrayList(Context context, int resource, 
     int textViewResourceId, List<ResolveInfo> objects) { 


    super(context, resource, textViewResourceId, objects); 
    this.context = context; 
    this.items = objects.toArray(); 
     this.layoutId = resource; 

    // TODO Auto-generated constructor stub 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View row = convertView; 

    if(row==null){ 
      LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row=inflater.inflate(R.layout.basiclistview,parent, false); 
     TextView label=(TextView)row.findViewById(R.id.text1); 
    label.setText(((ResolveInfo)items[position]).activityInfo.applicationInfo.loadLabel(context.getPackageManager()).toString()); 
    ImageView image = (ImageView) row.findViewById(R.id.logo); 
    image.setImageDrawable(((ResolveInfo)items[position]).activityInfo.applicationInfo.loadIcon(context.getPackageManager())); 

    } 


    return(row); 

} 

}