how to use queryIntentActivityOptions() method

那年仲夏 提交于 2019-12-02 13:20:02
Ragu Swaminathan

check the below working code to open, Camera and browse through gallery at once.

 // Picks Camera first.
final List<Intent> cameraIntents = new ArrayList<Intent>();
final Intent captureIntent = new Intent(
        android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
final PackageManager packageManager = getPackageManager();
final List<ResolveInfo> listCam = packageManager.queryIntentActivities(
        captureIntent, 0);
for (ResolveInfo res : listCam) {
  final String packageName = res.activityInfo.packageName;
  final Intent intent = new Intent(captureIntent);
  intent.setComponent(new ComponentName(res.activityInfo.packageName,
          res.activityInfo.name));
  intent.setPackage(packageName);
  intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
  cameraIntents.add(intent);
}

final Intent galleryIntent = new Intent();
galleryIntent.setType("image/*");
galleryIntent.setAction(Intent.ACTION_PICK);

// Chooser of filesystem options.
final Intent chooserIntent = Intent.createChooser(galleryIntent,
        "Select Image from");

// Add the camera options.
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
        cameraIntents.toArray(new Parcelable[]{}));

startActivityForResult(chooserIntent, TAKE_PHOTO_CODE);

This will help you.!!

Reference links and tutorials click here.

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);
                   String packageName = launchable.activityInfo.packageName;
        String className = launchable.activityInfo.name;
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        ComponentName cn = new ComponentName(packageName, className);
        intent.setComponent(cn);
        startActivity(intent);
        }
    });



 /**
     * Retrieve a set of activities that should be presented to the user as
     * similar options.  This is like {@link #queryIntentActivities}, except it
     * also allows you to supply a list of more explicit Intents that you would
     * like to resolve to particular options, and takes care of returning the
     * final ResolveInfo list in a reasonable order, with no duplicates, based
     * on those inputs.
     *
     * @param caller The class name of the activity that is making the
     *               request.  This activity will never appear in the output
     *               list.  Can be null.
     * @param specifics An array of Intents that should be resolved to the
     *                  first specific results.  Can be null.
     * @param intent The desired intent as per resolveActivity().
     * @param flags Additional option flags.  The most important is
     * {@link #MATCH_DEFAULT_ONLY}, to limit the resolution to only
     * those activities that support the {@link android.content.Intent#CATEGORY_DEFAULT}.
     *
     * @return A List&lt;ResolveInfo&gt; containing one entry for each matching
     *         Activity. These are ordered first by all of the intents resolved
     *         in <var>specifics</var> and then any additional activities that
     *         can handle <var>intent</var> but did not get included by one of
     *         the <var>specifics</var> intents.  If there are no matching
     *         activities, an empty list is returned.
     *
     * @see #MATCH_DEFAULT_ONLY
     * @see #GET_INTENT_FILTERS
     * @see #GET_RESOLVED_FILTER
     */
    public abstract List<ResolveInfo> queryIntentActivityOptions(
            ComponentName caller, Intent[] specifics, Intent intent, int flags);

First, you need a good understanding of queryIntentActivityOptions() method of class PackageManager.

QueryIntentActivityOptions(ComponentName caller, Intent[] specifics,Intent intent, int flags)

  • caller - This is the name of the class you are currently calling this method from. usually we use this.getComponentName as the value for this parameter.

  • specifics - This is an array of intents that you want to be first resolved. for your case, you can put any of the two intents you have. i.e photoPickerIntent or takePictureIntent like this

    new Intent[] {takePicture}

    NOTE: this parameter value can be null if you have only one intent. in that case, i think it would be better to use QueryIntentActivities. but for your case, since you have more than one intent, continue using this method.

  • intent - Here you place your desired intent. i.e between the two intents that you have, the one you desided not to put in the array because you so it as the most important one

    NOTE: this parameter value cannot be null. putting a null value will throw a NullPointerException!

  • flags - This is like a filter or extra that you want to be included in any of the resolved activites returned by this method.

    • PackageManager.MATCH_DEFAULT_ONLY - puting this option will filter the resolved activities and select the activities that belong to default applications in your device.e.g if ACTION_IMAGE_CAPTURE can be resolved by two apps, one which is the default and the other is third party one, e.g you downloaded it, one the default will be selected

    • PackageManager.GET_INTENT_FILTERS - this option return information about all the intent filters that the resolved app can handle. e.g you can have an app that resolved ACTION_IMAGE_CAPTURE and yet it can also resolve ACTION_PICK

    • PackageManager.GET_RESOLVED_FILTER - this option return the intent filter that each of the apps in the list resolved

A WORKING EXAMPLE

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);

Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

photoPickerIntent.setType("image/*");

PackageManager pm=getPackageManager();


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

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

You can then populate your listview using the above list of lauchaubles

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

 AppAdapter 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));
}
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!