【问题标题】:open files (pdf , mp3 , mp4 , ...) when Clicking on the recyclerView单击 recyclerView 时打开文件(pdf、mp3、mp4、...)
【发布时间】:2016-09-27 05:56:04
【问题描述】:

我有一个 RecyclerView 显示应用程序目录中存在的文件列表。现在,当用户单击特定行时,该文件将打开。

这是我的 RecyclerView 的截图:

这是我的适配器代码的 viewHolder:

// ===========================  ViewHolder ==========================

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView txtTitle;
        private ImageView imgDelete;

        public ViewHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
            txtTitle = (TextView) itemView.findViewById(R.id.txt_file_title);
            imgDelete = (ImageView) itemView.findViewById(R.id.img_delete_row_show);
        }

        @Override
        public void onClick(View v) {
            Toast.makeText(v.getContext(), txtTitle.getText(), Toast.LENGTH_SHORT).show();
            //?????
        }
    }

【问题讨论】:

    标签: android android-recyclerview material-design


    【解决方案1】:

    您需要在 onClick(View v) 方法中使用以下代码

           //For pdf file
             file = new File ("/mnt/sdcard/test.pdf");
             Intent intent = new Intent(Intent.ACTION_VIEW);
             intent.setDataAndType(path, "application/pdf");
             intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
             startActivity(intent);
    
         // for mp3 file
    
             file = new File ("/mnt/sdcard/test.mp3");
             Intent intent = new Intent(Intent.ACTION_VIEW);
             intent.setDataAndType(path,  "audio/*");
             intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
             startActivity(intent);
    

    在文件对象中设置文件的路径,并将适当的MIME类型作为intent.setDataAndType()方法的第二个参数,你就可以开始了

    【讨论】:

    • 这有一个错误:没有找到处理 Intent 的活动 { act=android.intent.action.VIEW dat=/storage/emulated/0/Android/data/my.package.name/files /downloaded/established.pdf typ=application/pdf flg=0x4000000 },,,,,看代码:pastebin.com/jFGU6vLy
    • 那么,您确定您的设备上安装了 PDF 查看器应用程序吗?
    • 请检查您的 txtTitle.getText().toString() 方法是否返回 pastebin 示例的扩展名为 .pdf 的文件名。
    【解决方案2】:

    这是这项工作的最佳解决方案,(Source)

    // ===========================  ViewHolder ==========================
        public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
            private TextView txtTitle;
            private ImageView imgDelete;
    
            public ViewHolder(View itemView) {
                super(itemView);
                itemView.setOnClickListener(this);
                txtTitle = (TextView) itemView.findViewById(R.id.txt_file_title);
                imgDelete = (ImageView) itemView.findViewById(R.id.img_delete_row_show);
            }
    
            @Override
            public void onClick(View v) {
    
                String selectedFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/my.package.name/files/downloaded/" + txtTitle.getText().toString();
                File file = new File(selectedFilePath);
                try {
                    FileOpen.openFile(v.getContext(),file);
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
    
            }
        }
    

    这是处理所有格式的 Helper 类:

    public class FileOpen {
    
        public static void openFile(Context context, File url) throws IOException {
            // Create URI
            File file=url;
            Uri uri = Uri.fromFile(file);
    
            Intent intent = new Intent(Intent.ACTION_VIEW);
            // Check what kind of file you are trying to open, by comparing the url with extensions.
            // When the if condition is matched, plugin sets the correct intent (mime) type,
            // so Android knew what application to use to open the file
            if (url.toString().contains(".doc") || url.toString().contains(".docx")) {
                // Word document
                intent.setDataAndType(uri, "application/msword");
            } else if(url.toString().contains(".pdf")) {
                // PDF file
                intent.setDataAndType(uri, "application/pdf");
            } else if(url.toString().contains(".ppt") || url.toString().contains(".pptx")) {
                // Powerpoint file
                intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
            } else if(url.toString().contains(".xls") || url.toString().contains(".xlsx")) {
                // Excel file
                intent.setDataAndType(uri, "application/vnd.ms-excel");
            } else if(url.toString().contains(".zip") || url.toString().contains(".rar")) {
                // WAV audio file
                intent.setDataAndType(uri, "application/x-wav");
            } else if(url.toString().contains(".rtf")) {
                // RTF file
                intent.setDataAndType(uri, "application/rtf");
            } else if(url.toString().contains(".wav") || url.toString().contains(".mp3")) {
                // WAV audio file
                intent.setDataAndType(uri, "audio/x-wav");
            } else if(url.toString().contains(".gif")) {
                // GIF file
                intent.setDataAndType(uri, "image/gif");
            } else if(url.toString().contains(".jpg") || url.toString().contains(".jpeg") || url.toString().contains(".png")) {
                // JPG file
                intent.setDataAndType(uri, "image/jpeg");
            } else if(url.toString().contains(".txt")) {
                // Text file
                intent.setDataAndType(uri, "text/plain");
            } else if(url.toString().contains(".3gp") || url.toString().contains(".mpg") || url.toString().contains(".mpeg") || url.toString().contains(".mpe") || url.toString().contains(".mp4") || url.toString().contains(".avi")) {
                // Video files
                intent.setDataAndType(uri, "video/*");
            } else {
                //if you want you can also define the intent type for any other file
    
                //additionally use else clause below, to manage other unknown extensions
                //in this case, Android will show all applications installed on the device
                //so you can choose which application to use
                intent.setDataAndType(uri, "*/*");
            }
    
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        }
    }
    

    【讨论】:

    • 你应该有一个用于 url.toString() 的局部变量,没有理由这样做 25 次 :)
    猜你喜欢
    • 1970-01-01
    • 2016-03-12
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多