类android.graphics.pdf.PdfDocument源码实例Demo

下面列出了怎么用android.graphics.pdf.PdfDocument的API类实例代码及写法,或者点击链接到github查看源代码。

源代码1 项目: PDFCreatorAndroid   文件: PDFUtil.java
/**
 * Do In Background.
 *
 * @param params Params
 * @return TRUE if PDF successfully generated else FALSE.
 */
@Override
protected File doInBackground(Void... params) {
    try {
        // Create PDF Document.
        PdfDocument pdfDocument = new PdfDocument();

        // Write content to PDFDocument.
        writePDFDocument(pdfDocument);

        // Save document to file.
        return savePDFDocumentToStorage(pdfDocument);
    } catch (Exception exception) {
        exception.printStackTrace();
        return null;
    }
}
 
源代码2 项目: PDFCreatorAndroid   文件: PDFUtil.java
/**
 * Writes given PDFDocument using content views.
 *
 * @param pdfDocument PDFDocument to be written.
 */
private void writePDFDocument(final PdfDocument pdfDocument) {

    for (int i = 0; i < mContentViews.size(); i++) {

        //Get Content View.
        View contentView = mContentViews.get(i);

        // crate a page description
        PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.
                Builder((int) PDF_PAGE_WIDTH, (int) PDF_PAGE_HEIGHT, i + 1).create();

        // start a page
        PdfDocument.Page page = pdfDocument.startPage(pageInfo);

        // draw view on the page
        Canvas pageCanvas = page.getCanvas();
        pageCanvas.scale(1f, 1f);
        int pageWidth = pageCanvas.getWidth();
        int pageHeight = pageCanvas.getHeight();
        int measureWidth = View.MeasureSpec.makeMeasureSpec(pageWidth, View.MeasureSpec.EXACTLY);
        int measuredHeight = View.MeasureSpec.makeMeasureSpec(pageHeight, View.MeasureSpec.EXACTLY);
        contentView.measure(measureWidth, measuredHeight);
        contentView.layout(0, 0, pageWidth, pageHeight);
        contentView.draw(pageCanvas);

        // finish the page
        pdfDocument.finishPage(page);

    }
}
 
@Override
public void onWrite(
        final PageRange[] pageRanges,
        final ParcelFileDescriptor destination,
        final CancellationSignal cancellationSignal,
        final WriteResultCallback callback
) {
    PdfDocument.Page page = mPdfDocument.startPage(0);

    if (cancellationSignal.isCanceled()) {
        callback.onWriteCancelled();
        mPdfDocument.close();
        mPdfDocument = null;
        return;
    }

    drawPage(page);

    mPdfDocument.finishPage(page);
    try {
        mPdfDocument.writeTo(new FileOutputStream(
                destination.getFileDescriptor()));
    } catch (IOException e) {
        callback.onWriteFailed(e.toString());
        return;
    } finally {
        mPdfDocument.close();
        mPdfDocument = null;
    }
    callback.onWriteFinished(pageRanges);
}
 
@Override
public void onWrite(
        final PageRange[] pageRanges,
        final ParcelFileDescriptor destination,
        final CancellationSignal cancellationSignal,
        final WriteResultCallback callback
) {
    PdfDocument.Page page = mPdfDocument.startPage(0);

    if (cancellationSignal.isCanceled()) {
        callback.onWriteCancelled();
        mPdfDocument.close();
        mPdfDocument = null;
        return;
    }

    drawPage(page);

    mPdfDocument.finishPage(page);
    try {
        mPdfDocument.writeTo(new FileOutputStream(
                destination.getFileDescriptor()));
    } catch (IOException e) {
        callback.onWriteFailed(e.toString());
        return;
    } finally {
        mPdfDocument.close();
        mPdfDocument = null;
    }
    callback.onWriteFinished(pageRanges);
}
 
源代码5 项目: slide   文件: StorageController.java
@Override
protected Boolean doInBackground(Void... params) {
    PdfDocument document = new PdfDocument();
    ParcelFileDescriptor pfd = null;
    try {
        PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(640, 640 * 9 / 16, 1).create();

        for (Slide slide : store.getState().slides()) {
            PdfDocument.Page page = document.startPage(pageInfo);
            page.getCanvas().drawColor(Style.COLOR_SCHEMES[store.getState().colorScheme()][1]);
            slide.render(mContext,
                    page.getCanvas(),
                    page.getCanvas().getWidth(), page.getCanvas().getHeight(),
                    Style.SLIDE_FONT,
                    Style.COLOR_SCHEMES[App.getState().colorScheme()][0],
                    Style.COLOR_SCHEMES[App.getState().colorScheme()][1],
                    true);
            document.finishPage(page);
        }

        pfd = mContext.getContentResolver().openFileDescriptor(uri, "w");
        if (pfd != null) {
            FileOutputStream fos = new FileOutputStream(pfd.getFileDescriptor());
            document.writeTo(fos);
            return true;
        } else {
            return false;
        }
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    } finally {
        document.close();
        if (pfd != null) {
            try { pfd.close(); } catch (IOException ignored) {}
        }
    }
}
 
private void drawPage(PdfDocument.Page page) {
    SQRLStorage storage = SQRLStorage.getInstance(activity);
    Canvas canvas = page.getCanvas();
    int marginLeftRight = 35;
    int marginTop = 65;
    int lastBlockY = marginTop;

    TextPaint headlineTextPaint = new TextPaint();
    headlineTextPaint.setTextSize(16);
    headlineTextPaint.setFakeBoldText(true);

    TextPaint bodyTextPaint = new TextPaint();
    bodyTextPaint.setTextSize(12);

    TextPaint identityTextTextPaint = new TextPaint(bodyTextPaint);
    identityTextTextPaint.setTypeface(Typeface.MONOSPACE);
    identityTextTextPaint.setFakeBoldText(true);

    String identityTitle = "\"" + identityName + "\" SQRL Identity";

    lastBlockY += DocumentPrintUtils.drawTextBlock(
            canvas,
            identityTitle,
            Layout.Alignment.ALIGN_CENTER,
            headlineTextPaint,
            marginTop,
            marginLeftRight);

    lastBlockY += DocumentPrintUtils.drawTextBlock(
            canvas,
            activity.getString(R.string.print_identity_desc1),
            Layout.Alignment.ALIGN_NORMAL,
            bodyTextPaint,
            lastBlockY + 20,
            marginLeftRight) + 20;

    byte[] saveData;
    if(this.withoutPassword) {
        saveData = storage.createSaveDataWithoutPassword();
    } else {
        saveData = storage.createSaveData();
    }

    int canvasMiddle = canvas.getWidth() / 2;
    QrCode qrCode = QrCode.encodeBinary(saveData, QrCode.Ecc.MEDIUM);
    Bitmap bitmap = qrCode.toImage(3, 0);

    int bitmapWidth = bitmap.getScaledWidth(canvas);

    canvas.drawBitmap(bitmap, canvasMiddle - (bitmapWidth / 2), lastBlockY + 20, new Paint());

    lastBlockY += bitmap.getScaledHeight(canvas) + 20;

    lastBlockY += DocumentPrintUtils.drawTextBlock(
            canvas,
            activity.getString(R.string.print_identity_desc2),
            Layout.Alignment.ALIGN_NORMAL,
            bodyTextPaint,
            lastBlockY + 20,
            marginLeftRight) + 30;


    int i = 0;
    try {
        Utils.refreshStorageFromDb(activity);
        for (String identityTextBlock : storage.getVerifyingRecoveryBlock().split("\n")) {
            lastBlockY += DocumentPrintUtils.drawTextBlock(
                    canvas,
                    identityTextBlock,
                    Layout.Alignment.ALIGN_CENTER,
                    identityTextTextPaint,
                    lastBlockY + 3,
                    marginLeftRight) + 3;
            i++;
        }
    } catch (Exception e) {
        Log.e(TAG, e.getMessage(), e);
    }

    DocumentPrintUtils.drawTextBlock(
            canvas,
            activity.getString(R.string.print_identity_desc3),
            Layout.Alignment.ALIGN_NORMAL,
            bodyTextPaint,
            lastBlockY + 20,
            marginLeftRight);

    DocumentPrintUtils.drawPrintPageFooter(activity, canvas);
}
 
private void drawPage(PdfDocument.Page page) {
    SQRLStorage storage = SQRLStorage.getInstance(activity);
    Canvas canvas = page.getCanvas();
    int marginTop = 65;
    int marginLeft = 35;
    int lastBlockY = marginTop;

    TextPaint headlineText = new TextPaint();
    headlineText.setAntiAlias(true);
    headlineText.setTextSize(24);
    headlineText.setFakeBoldText(true);

    TextPaint redBoldText = new TextPaint();
    redBoldText.setAntiAlias(true);
    redBoldText.setTextSize(24);
    redBoldText.setFakeBoldText(true);
    redBoldText.setColor(Color.RED);

    TextPaint stdText = new TextPaint();
    stdText.setAntiAlias(true);
    stdText.setTextSize(14);

    String headline = activity.getResources().getString(R.string.rescue_code_page_headline);
    String warning = "!! " + activity.getResources().getString(R.string.rescue_code_page_warning).toUpperCase() + " !!";
    String description = activity.getResources().getString(R.string.rescue_code_page_description);

    lastBlockY += DocumentPrintUtils.drawTextBlock(
            canvas,
            headline,
            Layout.Alignment.ALIGN_CENTER,
            headlineText,
            lastBlockY,
            marginLeft);

    lastBlockY += DocumentPrintUtils.drawTextBlock(
            canvas,
            warning,
            Layout.Alignment.ALIGN_CENTER,
            redBoldText,
            lastBlockY + 40,
            marginLeft) + 40;

    lastBlockY += DocumentPrintUtils.drawTextBlock(
            canvas,
            description,
            Layout.Alignment.ALIGN_NORMAL,
            stdText,
            lastBlockY + 20,
            marginLeft) + 20;

    List<String> rescueCode = storage.getTempShowableRescueCode();
    StringBuilder sb = new StringBuilder();
    boolean first = true;
    for (String s : rescueCode) {
        if (!first) sb.append("-");
        sb.append(s);
        first = false;
    }
    String rescueCodeOutput = sb.toString();

    lastBlockY += DocumentPrintUtils.drawTextBlock(
            canvas,
            rescueCodeOutput,
            Layout.Alignment.ALIGN_CENTER,
            redBoldText,
            lastBlockY + 60,
            marginLeft) + 60;

    String idName = activity.getResources().getString(R.string.txt_identity_name_hint) +
            ": __________________________________";

    DocumentPrintUtils.drawTextBlock(
            canvas,
            idName,
            Layout.Alignment.ALIGN_CENTER,
            stdText,
            lastBlockY + 60,
            marginLeft);

    DocumentPrintUtils.drawPrintPageFooter(activity, canvas);
}
 
源代码8 项目: ViewPrinter   文件: PdfPrinter.java
/**
 * Prints the current view to a PDF file, in the given directory and with the given
 * filename. If the file exists, it will be deleted.
 *
 * @param printId an (optional) identifier for the process
 * @param directory a directory where the file will be saved
 * @param filename the output file name
 */
@Override
public void print(final String printId, @NonNull final File directory, @NonNull String filename) {
    Context context = mDocument.getContext();
    if (!checkPermission(context, directory)) return;
    if (!checkPreview(printId, directory, filename)) return;
    if (!filename.toLowerCase().endsWith(".pdf")) filename += ".pdf";
    final File file = new File(directory, filename);
    if (!checkFile(printId, file)) return;

    if (mDocument.getPageCount() == 0) return;
    DocumentPage firstPage = mDocument.getPageAt(0);
    PrintSize size = mDocument.getPrintSize();

    // Create doc
    PrintAttributes attrs = new PrintAttributes.Builder()
            .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
            .setMediaSize(size.toMediaSize(firstPage))
            .setMinMargins(PrintAttributes.Margins.NO_MARGINS)
            .build();
    final PrintedPdfDocument doc = new PrintedPdfDocument(context, attrs);

    // Print page
    // Page canvas is passed in PostScript points. In order not to break View drawing,
    // we must scale that up back to pixels.
    dispatchOnPrePrint(mDocument);
    for (int i = 0; i < mDocument.getPageCount(); i++) {
        PdfDocument.Page page = doc.startPage(i);
        Canvas canvas = page.getCanvas();
        float pixelsToPoints = PrintSize.PIXELS_TO_INCHES(context) * PrintSize.INCHES_TO_POINTS;
        canvas.scale(pixelsToPoints, pixelsToPoints, 0, 0);

        DocumentPage view = mDocument.getPageAt(i);
        Drawable background = null;
        if (!mPrintBackground) {
            background = view.getBackground();
            view.setBackground(null);
        }
        view.draw(canvas);
        if (!mPrintBackground) {
            view.setBackground(background);
        }
        doc.finishPage(page);
    }
    dispatchOnPostPrint(mDocument);

    // I am not sure if the above would work with any view. Some views might be checking for
    // canvas.getWidth() or canvas.tryGetHeight(), which now are not consistent. If errors show up,
    // we might have to draw on a separate canvas and then scale the bitmap.
    // This has other drawbacks: the original pdf canvas, for example, takes text as text and
    // makes it selectable in the final PDF.

    // Print in a separate thread.
    // Since we're API 19 we can use try with resources.
    final Handler ui = new Handler();
    new Thread(new Runnable() {
        @Override
        public void run() {
            try (OutputStream stream = new BufferedOutputStream(new FileOutputStream(file))) {
                doc.writeTo(stream);
                ui.post(new Runnable() {
                    @Override
                    public void run() {
                        mCallback.onPrint(printId, file);
                    }
                });

            } catch (final IOException e) {
                ui.post(new Runnable() {
                    @Override
                    public void run() {
                        mCallback.onPrintFailed(printId, new RuntimeException("Invalid file: " + file, e));
                    }
                });
            }
        }
    }, TAG + "Worker").start();
}
 
源代码9 项目: prayer-times-android   文件: ExportController.java
public static void exportPDF(Context ctx, Times times, @NonNull LocalDate from, @NonNull LocalDate to) throws IOException {
    PdfDocument document = new PdfDocument();

    PdfDocument.PageInfo pageInfo;
    int pw = 595;
    int ph = 842;
    pageInfo = new PdfDocument.PageInfo.Builder(pw, ph, 1).create();
    PdfDocument.Page page = document.startPage(pageInfo);
    Drawable launcher = Drawable.createFromStream(ctx.getAssets().open("pdf/launcher.png"), null);
    Drawable qr = Drawable.createFromStream(ctx.getAssets().open("pdf/qrcode.png"), null);
    Drawable badge =
            Drawable.createFromStream(ctx.getAssets().open("pdf/badge_" + LocaleUtils.getLanguage("en", "de", "tr", "fr", "ar") + ".png"),
                    null);

    launcher.setBounds(30, 30, 30 + 65, 30 + 65);
    qr.setBounds(pw - 30 - 65, 30 + 65 + 5, pw - 30, 30 + 65 + 5 + 65);
    int w = 100;
    int h = w * badge.getIntrinsicHeight() / badge.getIntrinsicWidth();
    badge.setBounds(pw - 30 - w, 30 + (60 / 2 - h / 2), pw - 30, 30 + (60 / 2 - h / 2) + h);


    Canvas canvas = page.getCanvas();

    Paint paint = new Paint();
    paint.setARGB(255, 0, 0, 0);
    paint.setTextSize(10);
    paint.setTextAlign(Paint.Align.CENTER);
    canvas.drawText("com.metinkale.prayer", pw - 30 - w / 2f, 30 + (60 / 2f - h / 2f) + h + 10, paint);

    launcher.draw(canvas);
    qr.draw(canvas);
    badge.draw(canvas);

    paint.setARGB(255, 61, 184, 230);
    canvas.drawRect(30, 30 + 60, pw - 30, 30 + 60 + 5, paint);


    if (times.getSource().drawableId != 0) {
        Drawable source = ctx.getResources().getDrawable(times.getSource().drawableId);

        h = 65;
        w = h * source.getIntrinsicWidth() / source.getIntrinsicHeight();
        source.setBounds(30, 30 + 65 + 5, 30 + w, 30 + 65 + 5 + h);
        source.draw(canvas);
    }

    paint.setARGB(255, 0, 0, 0);
    paint.setTextSize(40);
    paint.setTextAlign(Paint.Align.LEFT);
    canvas.drawText(ctx.getText(R.string.appName).toString(), 30 + 65 + 5, 30 + 50, paint);
    paint.setTextAlign(Paint.Align.CENTER);
    paint.setFakeBoldText(true);
    canvas.drawText(times.getName(), pw / 2.0f, 30 + 65 + 50, paint);

    paint.setTextSize(12);
    int y = 30 + 65 + 5 + 65 + 30;
    int p = 30;
    int cw = (pw - p - p) / 7;
    canvas.drawText(ctx.getString(R.string.date), 30 + (0.5f * cw), y, paint);
    canvas.drawText(FAJR.getString(), 30 + (1.5f * cw), y, paint);
    canvas.drawText(Vakit.SUN.getString(), 30 + (2.5f * cw), y, paint);
    canvas.drawText(Vakit.DHUHR.getString(), 30 + (3.5f * cw), y, paint);
    canvas.drawText(Vakit.ASR.getString(), 30 + (4.5f * cw), y, paint);
    canvas.drawText(Vakit.MAGHRIB.getString(), 30 + (5.5f * cw), y, paint);
    canvas.drawText(Vakit.ISHAA.getString(), 30 + (6.5f * cw), y, paint);
    paint.setFakeBoldText(false);
    do {
        y += 20;
        canvas.drawText((from.toString("dd.MM.yyyy")), 30 + (0.5f * cw), y, paint);
        canvas.drawText(times.getTime(from, FAJR.ordinal()).toLocalTime().toString(), 30 + (1.5f * cw), y, paint);
        canvas.drawText(times.getTime(from, SUN.ordinal()).toLocalTime().toString(), 30 + (2.5f * cw), y, paint);
        canvas.drawText(times.getTime(from, DHUHR.ordinal()).toLocalTime().toString(), 30 + (3.5f * cw), y, paint);
        canvas.drawText(times.getTime(from, ASR.ordinal()).toLocalTime().toString(), 30 + (4.5f * cw), y, paint);
        canvas.drawText(times.getTime(from, MAGHRIB.ordinal()).toLocalTime().toString(), 30 + (5.5f * cw), y, paint);
        canvas.drawText(times.getTime(from, ISHAA.ordinal()).toLocalTime().toString(), 30 + (6.5f * cw), y, paint);
    } while (!(from = from.plusDays(1)).isAfter(to));
    document.finishPage(page);


    File outputDir = ctx.getCacheDir();
    if (!outputDir.exists())
        outputDir.mkdirs();
    File outputFile = new File(outputDir, times.getName().replace(" ", "_") + ".pdf");
    if (outputFile.exists())
        outputFile.delete();
    FileOutputStream outputStream = new FileOutputStream(outputFile);
    document.writeTo(outputStream);
    document.close();

    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.setType("application/pdf");

    Uri uri = FileProvider.getUriForFile(ctx, ctx.getString(R.string.FILE_PROVIDER_AUTHORITIES), outputFile);
    shareIntent.putExtra(Intent.EXTRA_STREAM, uri);

    ctx.startActivity(Intent.createChooser(shareIntent, ctx.getResources().getText(R.string.export)));
}
 
源代码10 项目: prayer-times-android   文件: ExportController.java
public static void exportPDF(Context ctx, Times times, @NonNull LocalDate from, @NonNull LocalDate to) throws IOException {
    PdfDocument document = new PdfDocument();

    PdfDocument.PageInfo pageInfo;
    int pw = 595;
    int ph = 842;
    pageInfo = new PdfDocument.PageInfo.Builder(pw, ph, 1).create();
    PdfDocument.Page page = document.startPage(pageInfo);
    Drawable launcher = Drawable.createFromStream(ctx.getAssets().open("pdf/launcher.png"), null);
    Drawable qr = Drawable.createFromStream(ctx.getAssets().open("pdf/qrcode.png"), null);
    Drawable badge =
            Drawable.createFromStream(ctx.getAssets().open("pdf/badge_" + LocaleUtils.getLanguage("en", "de", "tr", "fr", "ar") + ".png"),
                    null);

    launcher.setBounds(30, 30, 30 + 65, 30 + 65);
    qr.setBounds(pw - 30 - 65, 30 + 65 + 5, pw - 30, 30 + 65 + 5 + 65);
    int w = 100;
    int h = w * badge.getIntrinsicHeight() / badge.getIntrinsicWidth();
    badge.setBounds(pw - 30 - w, 30 + (60 / 2 - h / 2), pw - 30, 30 + (60 / 2 - h / 2) + h);


    Canvas canvas = page.getCanvas();

    Paint paint = new Paint();
    paint.setARGB(255, 0, 0, 0);
    paint.setTextSize(10);
    paint.setTextAlign(Paint.Align.CENTER);
    canvas.drawText("com.metinkale.prayer", pw - 30 - w / 2f, 30 + (60 / 2f - h / 2f) + h + 10, paint);

    launcher.draw(canvas);
    qr.draw(canvas);
    badge.draw(canvas);

    paint.setARGB(255, 61, 184, 230);
    canvas.drawRect(30, 30 + 60, pw - 30, 30 + 60 + 5, paint);


    if (times.getSource().drawableId != 0) {
        Drawable source = ctx.getResources().getDrawable(times.getSource().drawableId);

        h = 65;
        w = h * source.getIntrinsicWidth() / source.getIntrinsicHeight();
        source.setBounds(30, 30 + 65 + 5, 30 + w, 30 + 65 + 5 + h);
        source.draw(canvas);
    }

    paint.setARGB(255, 0, 0, 0);
    paint.setTextSize(40);
    paint.setTextAlign(Paint.Align.LEFT);
    canvas.drawText(ctx.getText(R.string.appName).toString(), 30 + 65 + 5, 30 + 50, paint);
    paint.setTextAlign(Paint.Align.CENTER);
    paint.setFakeBoldText(true);
    canvas.drawText(times.getName(), pw / 2.0f, 30 + 65 + 50, paint);

    paint.setTextSize(12);
    int y = 30 + 65 + 5 + 65 + 30;
    int p = 30;
    int cw = (pw - p - p) / 7;
    canvas.drawText(ctx.getString(R.string.date), 30 + (0.5f * cw), y, paint);
    canvas.drawText(FAJR.getString(), 30 + (1.5f * cw), y, paint);
    canvas.drawText(Vakit.SUN.getString(), 30 + (2.5f * cw), y, paint);
    canvas.drawText(Vakit.DHUHR.getString(), 30 + (3.5f * cw), y, paint);
    canvas.drawText(Vakit.ASR.getString(), 30 + (4.5f * cw), y, paint);
    canvas.drawText(Vakit.MAGHRIB.getString(), 30 + (5.5f * cw), y, paint);
    canvas.drawText(Vakit.ISHAA.getString(), 30 + (6.5f * cw), y, paint);
    paint.setFakeBoldText(false);
    do {
        y += 20;
        canvas.drawText((from.toString("dd.MM.yyyy")), 30 + (0.5f * cw), y, paint);
        canvas.drawText(times.getTime(from, FAJR.ordinal()).toLocalTime().toString(), 30 + (1.5f * cw), y, paint);
        canvas.drawText(times.getTime(from, SUN.ordinal()).toLocalTime().toString(), 30 + (2.5f * cw), y, paint);
        canvas.drawText(times.getTime(from, DHUHR.ordinal()).toLocalTime().toString(), 30 + (3.5f * cw), y, paint);
        canvas.drawText(times.getTime(from, ASR.ordinal()).toLocalTime().toString(), 30 + (4.5f * cw), y, paint);
        canvas.drawText(times.getTime(from, MAGHRIB.ordinal()).toLocalTime().toString(), 30 + (5.5f * cw), y, paint);
        canvas.drawText(times.getTime(from, ISHAA.ordinal()).toLocalTime().toString(), 30 + (6.5f * cw), y, paint);
    } while (!(from = from.plusDays(1)).isAfter(to));
    document.finishPage(page);


    File outputDir = ctx.getCacheDir();
    if (!outputDir.exists())
        outputDir.mkdirs();
    File outputFile = new File(outputDir, times.getName().replace(" ", "_") + ".pdf");
    if (outputFile.exists())
        outputFile.delete();
    FileOutputStream outputStream = new FileOutputStream(outputFile);
    document.writeTo(outputStream);
    document.close();

    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.setType("application/pdf");

    Uri uri = FileProvider.getUriForFile(ctx, ctx.getString(R.string.FILE_PROVIDER_AUTHORITIES), outputFile);
    shareIntent.putExtra(Intent.EXTRA_STREAM, uri);

    ctx.startActivity(Intent.createChooser(shareIntent, ctx.getResources().getText(R.string.export)));
}
 
 类所在包
 同包方法