Wie in Android Developer geschrieben auf Activities
In anderen Protokollen (wie ACTION_MAIN oder ACTION_VIEW) erhalten Sie das Ergebnis möglicherweise nicht erwartungsgemäß.
Sie nicht auf Aktion Ansichten Rückkehr zählen kann, was man erwarten würde, also was ich tat, war eine benutzerdefinierte Benachrichtigung Dialog implementieren, die alle möglichen Anwendungen zeigt, die eine bestimmte Datei, eine leicht modifizierte Version wie hier Custom intent chooser gezeigt öffnen
-Code für diejenigen fragen, die ihm einen filePath als Parameter übernimmt und zeigt Ihnen alle installierten Anwendungen, die diese Datei des Typs, indem sie die mimetype.Works mit fullpaths.Can umgehen kann dies mit
AlertDialogIntentChooser alertDialog = new AlertDialogIntentChooser(filePath,getActivity());
alertDialog.show();
genannt werden, ist die Klasse kann es ein opt ional Delegierten aswell für Aktivität Rückrufe
public class AlertDialogIntentChooser {
private String filePath;
private Activity activity;
private AlertDialog dialog;
private AlertDialogDelegate delegate;
private ListItem[] items;
public AlertDialogIntentChooser(String filePath,Activity activity){
this.filePath = filePath;
this.activity = activity;
init();
}
public void setDialogDelegate(AlertDialogDelegate delegate){
this.delegate = delegate;
}
private void init(){
initApplicationItems();
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle(Strings.STRING_SELECT_APPLICATION);
builder.setIcon(R.drawable.ic_share);
builder.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface paramDialogInterface) {
if(delegate!=null)
delegate.onDialogCancelled(paramDialogInterface);
}
});
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intentPdf = new Intent(Intent.ACTION_VIEW);
MimeTypeMap myMime = MimeTypeMap.getSingleton();
String fileExt = MimeTypeMap.getFileExtensionFromUrl(Uri.parse(filePath));
String mimeType = myMime.getMimeTypeFromExtension(fileExt);
intentPdf.setClassName(items[which].context, items[which].packageClassName);
intentPdf.setDataAndType(Uri.parse(filePath), mimeType);
try {
activity.startActivity(intentPdf);
dialog.dismiss();
if(delegate!=null)
delegate.onItemSelected(items[which].context, items[which].packageClassName);
}catch (ActivityNotFoundException e) {
Toast.makeText(activity,
Strings.ERROR_NO_VIEWER,
Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
}
});
dialog = builder.create();
}
private void initApplicationItems(){
Intent intentPdf = new Intent(Intent.ACTION_VIEW);
MimeTypeMap myMime = MimeTypeMap.getSingleton();
String fileExt = MimeTypeMap.getFileExtensionFromUrl(Uri.parse(filePath));
String mimeType = myMime.getMimeTypeFromExtension(fileExt);
intentPdf.setDataAndType(Uri.parse(filePath), mimeType);
PackageManager pm = activity.getPackageManager();
List<ResolveInfo> resInfos = pm.queryIntentActivities(intentPdf, 0);
items = new ListItem[resInfos.size()];
int i = 0;
for (ResolveInfo resInfo : resInfos) {
String context = resInfo.activityInfo.packageName;
String packageClassName = resInfo.activityInfo.name;
CharSequence label = resInfo.loadLabel(pm);
Drawable icon = resInfo.loadIcon(pm);
items[i] = new ListItem(label.toString(), icon, context, packageClassName);
++i;
}
}
public void show(){
dialog.show();
}
private ListAdapter adapter = new ArrayAdapter<ListItem>(
activity,
android.R.layout.select_dialog_item,
android.R.id.text1,
items){
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
TextView tv = (TextView)v.findViewById(android.R.id.text1);
int dpS = (int) (72 * activity.getResources().getDisplayMetrics().density * 0.5f);
items[position].icon.setBounds(0, 0, dpS, dpS);
tv.setCompoundDrawables(items[position].icon, null, null, null);
int dp5 = (int) (5 * activity.getResources().getDisplayMetrics().density * 0.5f);
tv.setCompoundDrawablePadding(dp5);
return v;
}
};
class ListItem {
public final String name;
public final Drawable icon;
public final String context;
public final String packageClassName;
public ListItem(String text, Drawable icon, String context, String packageClassName) {
this.name = text;
this.icon = icon;
this.context = context;
this.packageClassName = packageClassName;
}
@Override
public String toString() {
return name;
}
}
public static interface AlertDialogDelegate{
public void onDialogCancelled(DialogInterface paramDialogInterface);
public void onItemSelected(String packageName, String className);
}
}
Ich muss wissen, ob ein Der Benutzer klickt auf etwas oder schließt den Dialog – sokie