在Android(6.0)中打开未知文件类型

时间:2017-07-12 14:19:03

标签: android android-intent

没有告诉用户他们无法打开他们的文件b / c "没有支持的应用程序" (即三星)或其他什么,我不想让他们选择一个应用,例如华硕(KitKat)使用文件管理器。打开名为 test.noapp 的文件会显示以下提示

enter image description here

选择文本然后提供文本处理应用列表

enter image description here

我是否必须推出自己的" Open as" 类别列表,或者我可以利用API(级别23)中的某些内容?

以下代码用于打开文件

Intent viewFileIntent = new Intent(Intent.ActionView);

Android.Net.Uri uriFile = Android.Net.Uri.FromFile(selectedAttachmentDetails.File);
string mimeType = GetAttachmentFileTypeMimeString(selectedAttachmentDetails.File.Name);

viewFileIntent.SetDataAndType(uriFile, mimeType);

THIS.StartActivityForResult(Intent.CreateChooser(viewFileIntent, "Complete action using"), 0);

private string GetAttachmentFileTypeMimeString(string attachmentFileName)
{
    string ext = Android.Webkit.MimeTypeMap.GetFileExtensionFromUrl(attachmentFileName);
    Android.Webkit.MimeTypeMap map = Android.Webkit.MimeTypeMap.Singleton;

    string mimeType = map.GetMimeTypeFromExtension(ext);    

    return mimeType == null ? "*/*" : mimeType;
}

2 个答案:

答案 0 :(得分:1)

他们询问是否textaudiovideo等等的原因是设置详细mime并让android操作系统处理它

考虑到这一点,你可以猜测 mime并设置它。除此之外还有guessContentTypeFromStream

来自班级MimeTypeMap

答案 1 :(得分:0)

<强> styles.xml

<style name="OpenAsDialog" parent="android:Theme.Holo.Light.Dialog">  
    <item name="android:windowIsFloating">true</item>  
</style>

<强> OpenAsDialog.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/open_as_dialog_root"
  android:orientation="vertical"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="#C0C0C0">
  <TextView
    android:id="@+id/open_as_dialog_tv_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom ="0.5dp"
    android:padding="10dp"
    android:background="#FFFFFF"
    android:text="Text"
    android:textSize="16sp"
    android:textColor ="#808080"/>
  <TextView
    android:id="@+id/open_as_dialog_tv_image"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom ="0.5dp"
    android:paddingTop="0dp"
    android:padding="10dp"
    android:background="#FFFFFF"
    android:text="Image"
    android:textSize="16sp"
    android:textColor ="#808080"/>
  <TextView
    android:id="@+id/open_as_dialog_tv_audio"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom ="0.5dp"
    android:padding="10dp"
    android:background="#FFFFFF"
    android:text="Audio"
    android:textSize="16sp"
    android:textColor ="#808080"/>
  <TextView
    android:id="@+id/open_as_dialog_tv_video"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:background="#FFFFFF"
    android:text="Video"
    android:textSize="16sp"
    android:textColor ="#808080"/>      
</LinearLayout>

<强> DialogFragment

public class OpenAsDialog : DialogFragment
{
    public static OpenAsDialog NewInstance()
    {
        OpenAsDialog dialogFragment = new OpenAsDialog();            

        return dialogFragment;
    }

    public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        SetStyle(DialogFragmentStyle.Normal, Resource.Style.OpenAsDialog);            
    }        

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View messageView = inflater.Inflate(Resource.Layout.OpenAsDialog, container, false);            

        return messageView;
    }

    public override void OnViewCreated(View view, Bundle savedInstanceState)
    {
        base.OnViewCreated(view, savedInstanceState);

        Dialog.SetTitle("Open as");
    }        
}

<强>用法

private void ShowOpenAsDialog()
{
    OpenAsDialog openAsDialog = OpenAsDialog.NewInstance();
    openAsDialog.Show(THIS.FragmentManager, "open_as_dialog");
}