无法从 ResolveInfo 实例获取意图过滤器
Unable to acquire intent filter from ResolveInfo instance
我有一个列表,其中包含可以处理我的两个操作中的任何一个的应用程序 Intent.ACTION_PICK
和 MediaStore.ACTION_IMAGE_CAPTURE
。我稍后使用数组适配器使用此列表中的信息填充我的列表。
在我的 onItemClickListener
中,我能够从 ResolveInfo
实例中获取 ActivityInfo
和 ComponentName
。但我无法获取 IntentFilter
来自 ResolveInfo
的实例( 尝试获取它会抛出 NullPointerException),AND YET 中的任何应用程序我的列表 必须 解决了 我的一个意图是让它在列表中
这是抛出 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));
}
}
问题
我如何获得所选应用在我的 onClickListner 正文中解决的意图?
您需要明确表示要返回过滤器。而不是:
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 相关的错误和缺失的功能。在很多情况下,文档是错误的,在很多情况下,代码并没有按照您的预期执行,并且没有很多好的工作示例。
试试这个,如果有效请告诉我们。
我有一个列表,其中包含可以处理我的两个操作中的任何一个的应用程序 Intent.ACTION_PICK
和 MediaStore.ACTION_IMAGE_CAPTURE
。我稍后使用数组适配器使用此列表中的信息填充我的列表。
在我的 onItemClickListener
中,我能够从 ResolveInfo
实例中获取 ActivityInfo
和 ComponentName
。但我无法获取 IntentFilter
来自 ResolveInfo
的实例( 尝试获取它会抛出 NullPointerException),AND YET 中的任何应用程序我的列表 必须 解决了 我的一个意图是让它在列表中
这是抛出 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));
}
}
问题
我如何获得所选应用在我的 onClickListner 正文中解决的意图?
您需要明确表示要返回过滤器。而不是:
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 相关的错误和缺失的功能。在很多情况下,文档是错误的,在很多情况下,代码并没有按照您的预期执行,并且没有很多好的工作示例。
试试这个,如果有效请告诉我们。