安卓手机如何打开.pdf(1)文件_手机pdf格式怎么使用查找功能

安卓手机如何打开.pdf(1)文件_手机pdf格式怎么使用查找功能最近在做结算功能,需要上传发票功能,发票有电子和图片发票两种,技术这边有两种方案,一种是上传图片文件,还有一种是上传PDF格式发票文件,但是结算时财务说图片文件上面没有公司盖章,是无效的,于是把方案改为电子发票PDF和纸质发票,刚开始使用的文件管理器搜索手机内的PDF文件,在4.4系统上面打开文件管理器可以过滤掉非.pdf格式文件,在6.0及以上系统没有过滤掉,用的是intent打开u…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

前言:

最近在做订单结算功能,需要上传发票,发票有电子和图片发票两种,技术这边有两种方案,一种是上传图片文件,还有一种是上传PDF格式发票文件,但是结算时财务说图片文件上面没有公司盖章,是无效的,于是把方案改为电子发票PDF和纸质发票,刚开始使用的文件管理器搜索手机内的PDF文件,在4.4系统上面打开文件管理器可以过滤掉非.pdf格式文件,在6.0及以上系统没有过滤掉,用的是intent打开url的方式打开文件管理器,在返回的结果中根据URL转化为文件,然后上传。

1.先上效果图,无图无真相,图能说明一切:

img安卓手机如何打开.pdf(1)文件_手机pdf格式怎么使用查找功能

2.Intent方式打开pdf格式文件:

  Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("application/pdf");
        try {
           startActivityForResult(intent, REQUEST_CODE);
       } catch (ActivityNotFoundException e) {
            //alert user that file manager not working
            ToastUtils.ToastShort(Utils.getContext().getResources().getString(R.string.toast_pick_file_error));
        }

Jetbrains全家桶1年46,售后保障稳定

安卓手机如何打开.pdf(1)文件_手机pdf格式怎么使用查找功能

这种方式也可以拿到.pdf格式的文件,但是在小米手机上有个最近文件记录打开时返回报错,由于时间和项目着急上线,所以没有适配6.0及以上系统的手机,采用了第2种方式—-通过ContentProvider搜索手机内的.pdf格式文件

3.通过ContentProvider搜索pdf格式文件核心代码如下:

博主中搜索的是.pdf格式的文件,如果想搜索其他格式文件方法类似,改后缀名比如.txt,.doc,.png等等,小伙伴们可以自行尝试下,看看效果如何,这里就不一一尝试和介绍了.

/**
 * 获取手机文档数据
 *
 * @param
 */
public void getDocumentData() {
​
    String[] columns = new String[]{MediaStore.Files.FileColumns._ID, MediaStore.Files.FileColumns.MIME_TYPE, MediaStore.Files.FileColumns.SIZE, MediaStore.Files.FileColumns.DATE_MODIFIED, MediaStore.Files.FileColumns.DATA};
​
    String select = "(_data LIKE '%.pdf')";
​
    ContentResolver contentResolver = getContentResolver();
    Cursor cursor = contentResolver.query(MediaStore.Files.getContentUri("external"), columns, select, null, null);
​
    int columnIndexOrThrow_DATA = 0;
    if (cursor != null) {
        columnIndexOrThrow_DATA = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA);
    }
​
    if (cursor != null) {
        while (cursor.moveToNext()) {
​
            String path = cursor.getString(columnIndexOrThrow_DATA);
​
            PDFFileInfo document = PDFUtil.getFileInfoFromFile(new File(path));
​
            pdfData.add(document);
            Log.d(TAG, " pdf " + document);
        }
    }
    cursor.close();
}

安卓手机如何打开.pdf(1)文件_手机pdf格式怎么使用查找功能

4.PDFSearchActivity代码:

public class PDFSearchActivity extends AppCompatActivity {
    private RecyclerView mRecyclerView;
    private ProgressDialog progressDialog;
    private PDFAdapter pdfAdapter;
    private ImageView imgBack;
    private TextView tvTitle;
    private TextView tvFinish;
    private ArrayList<PDFFileInfo> pdfData = new ArrayList<>();
    private String TAG = PDFSearchActivity.class.getSimpleName();
​
​
    @SuppressLint("HandlerLeak")
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 1) {
                initRecyclerView();
            }
        }
    };
​
​
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pdf_select);
        initViews();
        initListener();
    }
​
    private void initViews() {
        mRecyclerView = findViewById(R.id.rv_pdf);
        imgBack = findViewById(R.id.iv_back);
        tvTitle = findViewById(R.id.tv_title);
        tvFinish = findViewById(R.id.tv_right);
        tvTitle.setText("PDF文件搜索");
​
        imgBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
​
        showDialog();
​
        new Thread() {
            @Override
            public void run() {
                super.run();
                getFolderData();
            }
        }.start();
    }
​
    private void initListener() {
​
    }
​
    private void showDialog() {
        progressDialog = new ProgressDialog(this, ProgressDialog.THEME_HOLO_LIGHT);
        progressDialog.setMessage("正在加载数据中...");
        progressDialog.setCanceledOnTouchOutside(false);
        progressDialog.show();
    }
​
​
    private void initRecyclerView() {
        pdfAdapter = new PDFAdapter(this);
        View notDataView = getLayoutInflater().inflate(R.layout.pdf_empty_view, (ViewGroup) mRecyclerView.getParent(), false);
​
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mRecyclerView.setAdapter(pdfAdapter);
​
        pdfAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
​
                if (!pdfData.get(position).isSelect()) {
                    if (getSelectNumber() >= 3) {
                        Toast.makeText(PDFSearchActivity.this, "最多可选择3个文件", Toast.LENGTH_SHORT).show();
                        return;
                    }
                }
​
                for (int i = 0; i < pdfData.size(); i++) {
                    if (i == position) {
                        if (pdfData.get(i).isSelect()) {
                            pdfData.get(i).setSelect(false);
                        } else {
                            pdfData.get(i).setSelect(true);
                        }
                    }
                }
                adapter.notifyDataSetChanged();
​
                tvFinish.setText("完成(" + getSelectNumber() + ")");
​
​
            }
        });
        if (pdfData != null && pdfData.size() > 0) {
​
            for (int i = 0; i < pdfData.size(); i++) {
                pdfData.get(i).setSelect(false);
            }
            pdfAdapter.setNewData(pdfData);
        } else {
            pdfAdapter.setEmptyView(notDataView);
        }
        progressDialog.dismiss();
    }
​
​
    /**
     * 遍历文件夹中资源
     */
    public void getFolderData() {
        getDocumentData();
        handler.sendEmptyMessage(1);
    }
​
    /**
     * 获取手机文档数据
     *
     * @param
     */
    public void getDocumentData() {
​
        String[] columns = new String[]{MediaStore.Files.FileColumns._ID, MediaStore.Files.FileColumns.MIME_TYPE, MediaStore.Files.FileColumns.SIZE, MediaStore.Files.FileColumns.DATE_MODIFIED, MediaStore.Files.FileColumns.DATA};
​
        String select = "(_data LIKE '%.pdf')";
​
        ContentResolver contentResolver = getContentResolver();
        Cursor cursor = contentResolver.query(MediaStore.Files.getContentUri("external"), columns, select, null, null);
​
        int columnIndexOrThrow_DATA = 0;
        if (cursor != null) {
            columnIndexOrThrow_DATA = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA);
        }
​
        if (cursor != null) {
            while (cursor.moveToNext()) {
​
                String path = cursor.getString(columnIndexOrThrow_DATA);
​
                PDFFileInfo document = PDFUtil.getFileInfoFromFile(new File(path));
​
                pdfData.add(document);
                Log.d(TAG, " pdf " + document);
            }
        }
        cursor.close();
    }
​
    private int getSelectNumber() {
        int k = 0;
        for (int i = 0; i < pdfData.size(); i++) {
            if (pdfData.get(i).isSelect()) {
                k++;
            }
        }
        return k;
    }
​
}

安卓手机如何打开.pdf(1)文件_手机pdf格式怎么使用查找功能

5.activity_pdf_select.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <include
        layout="@layout/toolbar"/>
​
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_pdf"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
​
    </androidx.recyclerview.widget.RecyclerView>
​
</LinearLayout>

安卓手机如何打开.pdf(1)文件_手机pdf格式怎么使用查找功能

6.PDFAdapter代码:

/**
 * @作者: njb
 * @时间: 2019/9/11 20:31
 * @描述: pdf文件适配器类
 */
public class PDFAdapter extends BaseQuickAdapter<PDFFileInfo, BaseViewHolder> {
​
    public PDFAdapter(@Nullable List<PDFFileInfo> data) {
        super(R.layout.item_pdf,data);
    }
​
​
    @Override
    protected void convert(BaseViewHolder helper, PDFFileInfo item) {
        if(item == null){
            return;
        }
        helper.setText(R.id.tv_name , item.getFileName());
        helper.setText(R.id.tv_size , PDFUtil.FormetFileSize(item.getFileSize()));
        helper.setText(R.id.tv_time , item.getTime());
        if (item.isSelect()){
            helper.getView(R.id.img_select).setBackgroundResource(R.mipmap.reward_selection_ok);
        }else {
            helper.getView(R.id.img_select).setBackgroundResource(R.mipmap.reward_selection_no);
​
        }
    }
}

安卓手机如何打开.pdf(1)文件_手机pdf格式怎么使用查找功能

7.PDFUtil

public class PDFUtil {
​
    /**
     * 读取文件的最后修改时间的方法
     */
    public static String getFileLastModifiedTime(File f) {
        Calendar cal = Calendar.getInstance();
        long time = f.lastModified();
        SimpleDateFormat formatter = new
                SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        cal.setTimeInMillis(time);
        return formatter.format(cal.getTime());
    }
​
​
​
​
    public static PDFFileInfo getFileInfoFromFile(File file) {
        PDFFileInfo fileInfo = new PDFFileInfo();
        fileInfo.setFileName(file.getName());
        fileInfo.setFilePath(file.getPath());
        fileInfo.setFileSize(file.length());
//        fileInfo.setDirectory(file.isDirectory());
        fileInfo.setTime(PDFUtil.getFileLastModifiedTime(file));
        int lastDotIndex = file.getName().lastIndexOf(".");
        if (lastDotIndex > 0) {
            String fileSuffix = file.getName().substring(lastDotIndex + 1);
//            fileInfo.setSuffix(fileSuffix);
        }
        return fileInfo;
    }
​
    public static String FormetFileSize(long fileS) {
        DecimalFormat df = new DecimalFormat("#.00");
        String fileSizeString = "";
        String wrongSize = "0B";
        if (fileS == 0) {
            return wrongSize;
        }
        if (fileS < 1024) {
            fileSizeString = df.format((double) fileS) + "B";
        } else if (fileS < 1048576) {
            fileSizeString = df.format((double) fileS / 1024) + "KB";
        } else if (fileS < 1073741824) {
            fileSizeString = df.format((double) fileS / 1048576) + "MB";
        } else {
            fileSizeString = df.format((double) fileS / 1073741824) + "GB";
        }
        return fileSizeString;
    }
​
    /**
     * 利用文件url转换出文件名
     *
     * @param url
     * @return
     */
    public static String parseName(String url) {
        String fileName = null;
        try {
            fileName = url.substring(url.lastIndexOf("/") + 1);
        } finally {
            if (TextUtils.isEmpty(fileName)) {
                fileName = String.valueOf(System.currentTimeMillis());
            }
        }
        return fileName;
    }
​
​
    /**
     * 将url进行encode,解决部分手机无法下载含有中文url的文件的问题(如OPPO R9)
     *
     * @param url
     * @return
     * @author xch
     */
    public static String toUtf8String(String url) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < url.length(); i++) {
            char c = url.charAt(i);
            if (c >= 0 && c <= 255) {
                sb.append(c);
            } else {
                byte[] b;
                try {
                    b = String.valueOf(c).getBytes("utf-8");
                } catch (Exception ex) {
                    System.out.println(ex);
                    b = new byte[0];
                }
                for (int j = 0; j < b.length; j++) {
                    int k = b[j];
                    if (k < 0)
                        k += 256;
                    sb.append("%" + Integer.toHexString(k).toUpperCase());
                }
            }
        }
        return sb.toString();
    }
​
    public static String parseFormat(String fileName) {
        return fileName.substring(fileName.lastIndexOf(".") + 1);
    }
}

安卓手机如何打开.pdf(1)文件_手机pdf格式怎么使用查找功能

8.PDFAdapter的Item代码

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_margin="@dimen/space_10">
​
    <ImageView
        android:id="@+id/img"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:src="@mipmap/pdf" />
​
    <ImageView
        android:id="@+id/img_select"
        android:layout_width="25dp"
        android:layout_height="25dp"
        android:background="@mipmap/reward_selection_no"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
​
​
    <TextView
        android:id="@+id/tv_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:maxLines="1"
        android:text="深入浅出nodejs.pdf"
        android:layout_marginLeft="6dp"
        android:layout_marginRight="6dp"
        app:layout_constraintLeft_toRightOf="@+id/img"
        app:layout_constraintRight_toLeftOf="@+id/img_select"/>
​
    <TextView
        android:id="@+id/tv_size"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="2dp"
        android:text="KB"
        android:textSize="@dimen/text_size_11"
        app:layout_constraintTop_toBottomOf="@+id/tv_name"
        app:layout_constraintLeft_toRightOf="@+id/img"
        android:layout_marginLeft="6dp"/>
​
    <TextView
        android:id="@+id/tv_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="6dp"
        android:text="2019-09-21"
        android:textSize="@dimen/text_size_11"
        app:layout_constraintLeft_toRightOf="@+id/img"
        app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

安卓手机如何打开.pdf(1)文件_手机pdf格式怎么使用查找功能

9.pdf_search_shape.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <solid android:color="@color/colorPrimary"/>
    <corners android:radius="@dimen/space_10"/>
</shape>

安卓手机如何打开.pdf(1)文件_手机pdf格式怎么使用查找功能

10.pdf_empty_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:gravity="center"
    android:background="@color/white"
    android:orientation="vertical"
    android:layout_height="match_parent">
    <ImageView
        android:layout_gravity="center"
        android:id="@+id/iv_nodata"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/no_date_without_text"
        android:visibility="visible" />
    <TextView
        android:id="@+id/tvTip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/str_blank"
        />
</LinearLayout>

安卓手机如何打开.pdf(1)文件_手机pdf格式怎么使用查找功能

11.Manifast加上权限申请

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

安卓手机如何打开.pdf(1)文件_手机pdf格式怎么使用查找功能

12.在MainActivity动态申请权限

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "RxPermissionTest";
    private Button btnUpload;
    private ImageView ivBack;
    private TextView tvTitle;
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
        requestPermission();
​
    }
​
    private void initViews() {
        btnUpload = findViewById(R.id.tv_upload);
        ivBack = findViewById(R.id.iv_back);
        tvTitle = findViewById(R.id.tv_title);
        tvTitle.setText("PDFSearch");
        ivBack.setVisibility(View.GONE);
        btnUpload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, PDFSearchActivity.class));
​
            }
        });
    }
​
    @SuppressLint("InlinedApi")
    private void requestPermission() {
        RxPermissions rxPermissions = new RxPermissions(this);
        rxPermissions.requestEach(Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE)
        .subscribe(new Consumer<Permission>() {
            @Override
            public void accept(Permission permission) {
                if (permission.granted) {
                    // 用户已经同意该权限
                    Log.d(TAG, permission.name + " is granted.");
                } else if (permission.shouldShowRequestPermissionRationale) {
                    // 用户拒绝了该权限,没有选中『不再询问』(Never ask again),那么下次再次启动时,还会提示请求权限的对话框
                    Log.d(TAG, permission.name + " is denied. More info should be provided.");
                } else {
                    // 用户拒绝了该权限,并且选中『不再询问』
                    Log.d(TAG, permission.name + " is denied.");
                }
​
            }
        });
    }
}

安卓手机如何打开.pdf(1)文件_手机pdf格式怎么使用查找功能

13.后面会给出源码地址,实现PDF预览功能.欢迎小伙伴们留言,有问题提出,及时改进.

csdn下载地址:PDFSearch.zip-Android文档类资源-CSDN下载,由于现在csdn默认的下载都要积分,不能修改,所以很抱歉哈~~

14.没有积分的同学也可以去码云下载源码,地址为:

PDFSearch: Android实现手机内PDF文件搜索

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/234928.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Tomcat 下载安装与配置

    Tomcat 下载安装与配置一、下载tomcat下载链接:https://tomcat.apache.org/1、进入tomcat官网后,选择需要下载的版本。我使用的是tomcat9,所以在这我选择tomcat92、选择z

  • Istio入门(dignity)

    1.简介在本教程中,我们将介绍服务网格的基础知识,并了解它如何实现分布式系统架构。我们将主要关注Istio,它是服务网格的一种具体实现。在此过程中,我们将介绍Istio的核心架构。2.什么是服务网格?在过去的几十年中,我们已经看到了单体应用程序开始拆分为较小的应用程序。此外,诸如Docker之类的容器化技术和诸如Kubernetes之类的编排系统加速了这一变化。尽管在像Kubernetes这样的分布式系统上采用微服务架构有许多优势,但它也具有相当的复杂性。由于分布式服务必须相互通信,因

  • php三个数从大到小排列_单分支if语句和双分支

    php三个数从大到小排列_单分支if语句和双分支<?php$a = rand(100,999);$b = rand(100,999);$c = rand(100,999);echo “a=”.”$a”.”<br>”;echo “b=”.”$b”.”<br>”;echo “c=”.”$c”.”<br>”;if(($a > $b ) && ($a > …

  • SOAP协议简介[通俗易懂]

    SOAP协议简介[通俗易懂]SOAP 简介SOAP是基于XML的简易协议,可使应用程序在HTTP之上进行信息交换。或者更简单地说:SOAP是用于访问网络服务的协议。您应当具备的基础知识在继续学习之前,您需要对下面的知识有基本的了解:XMLXML命名空间如果您希望首先学习这些项目,请访问我们的《XML教程》。什么是SOAP?SOAP指简易对象访问协议SOAP是一种通信协议SOAP用于应用程序之间的通信S…

  • 按位异或解题技巧「建议收藏」

    按位异或解题技巧「建议收藏」按位异或可以解决类似开灯问题一类的问题。首先了解下什么是按位异或:异或运算:首先异或表示当两个数的二进制表示,进行异或运算时,当前位的两个二进制表示不同则为1相同则为0.该方法被广泛推广用来统计一个数的1的位数!参与运算的两个值,如果两个相应bit位相同,则结果为0,否则为1。即:  0^0=0,  1^0=1,  0^1=1,  1^1=0按位异或的3个特点:…

  • 利用python打开别人手机摄像头_python 摄像头

    利用python打开别人手机摄像头_python 摄像头前言今天这个案例,就是控制自己的摄像头拍照,并且把拍下来的照片,通过邮件发到自己的邮箱里。想完成今天的这个案例,只要记住一个重点:你需要一个摄像头思路通过opencv调用摄像头拍照保存图像本地用email库构造邮件内容,保存的图像以附件形式插入邮件内容用smtplib库发送邮件到指定邮箱开始代码工具导入importtimeimportcv2#pipinstallopencv-python-i镜像源网址fromemail.mime.imageimport

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号