Open a selected file (image, pdf, …) programmatically from my Android Application?

后端 未结 9 1904
梦谈多话
梦谈多话 2020-12-02 17:34

I\'m working on an Android application which should be able to open a selected file from a specific folder.

I already tried this, but after selecting which applicati

相关标签:
9条回答
  • 2020-12-02 17:55

    You can try this

    File file = new File(filePath);
    MimeTypeMap map = MimeTypeMap.getSingleton();
    String ext = MimeTypeMap.getFileExtensionFromUrl(file.getName());
    String type = map.getMimeTypeFromExtension(ext);
    
    if (type == null)
        type = "*/*";
    
    Intent intent = new Intent(Intent.ACTION_VIEW);
    Uri data = Uri.fromFile(file);
    
    intent.setDataAndType(data, type);
    
    startActivity(intent);
    
    0 讨论(0)
  • 2020-12-02 17:56
    MimeTypeMap.getSingleton().getExtensionFromMimeType(file.getName());
    

    Probably, this is the easiest solution.

    https://developer.android.com/reference/android/webkit/MimeTypeMap

    https://developer.android.com/reference/java/net/URLConnection.html#guessContentTypeFromName(java.lang.String)

    private void openFile(File file) {
    
        Uri uri = Uri.fromFile(file);
    
        Intent intent = new Intent(Intent.ACTION_VIEW);
    
        intent.setDataAndType(uri, MimeTypeMap.getSingleton().getExtensionFromMimeType(file.getName()));
    
    
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(Intent.createChooser(intent, "Open " + file.getName() + " with ..."));
    }
    
    0 讨论(0)
  • 2020-12-02 18:05

    Try the following code.

    File file = new File(path); // path = your file path
    lastSlash = file.toString().lastIndexOf('/');
    
    if (lastSlash >= 0)
    {
        fileName = url.toString().substring(lastSlash + 1);
    }
    
    
    if (fileName.endsWith("pdf"))
    {
        mimeType = "application/pdf";
    }
    else
    {
        mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension
        (MimeTypeMap.getFileExtensionFromUrl(path));
    }
    
    Uri uri_path = Uri.fromFile(file);
    
    Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
    intent.putExtra(PATH, path);
    intent.putExtra(MIMETYPE, mimeType);
    intent.setType(mimeType);
    intent.setDataAndType(uri_path, mimeType);
    
    startActivity(intent);
    
    0 讨论(0)
  • 2020-12-02 18:10

    Use this code ,which helped me to open all types of files ...

     private void openFile(File url) {
    
        try {
    
            Uri uri = Uri.fromFile(url);
    
            Intent intent = new Intent(Intent.ACTION_VIEW);
            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")) {
                // ZIP file
                intent.setDataAndType(uri, "application/zip");
            } else if (url.toString().contains(".rar")){
                // RAR file
                intent.setDataAndType(uri, "application/x-rar-compressed");
            } 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 {
                intent.setDataAndType(uri, "*/*");
            }
    
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        } catch (ActivityNotFoundException e) {
            Toast.makeText(context, "No application found which can open the file", Toast.LENGTH_SHORT).show();
        }
    }
    
    0 讨论(0)
  • 2020-12-02 18:10

    Download source code from here (https://deepshikhapuri.wordpress.com/2017/04/24/open-pdf-file-from-sdcard-in-android-programmatically/)

    activity_main.xml:

    <?xml version=”1.0″ encoding=”utf-8″?>
    <RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
    xmlns:tools=”http://schemas.android.com/tools&#8221;
    android:id=”@+id/activity_main”
    android:layout_width=”match_parent”
    android:layout_height=”match_parent”
    android:background=”#efefef”>
    
    <ListView
    android:layout_width=”match_parent”
    android:id=”@+id/lv_pdf”
    android:divider=”#efefef”
    android:layout_marginLeft=”10dp”
    android:layout_marginRight=”10dp”
    android:layout_marginTop=”10dp”
    android:layout_marginBottom=”10dp”
    android:dividerHeight=”5dp”
    android:layout_height=”wrap_content”>
    
    </ListView>
    </RelativeLayout>
    

    MainActivity.java:

    package com.pdffilefromsdcard;
    
    import android.Manifest;
    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.os.Environment;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ListView;
    import android.widget.Toast;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
    
    ListView lv_pdf;
    public static ArrayList<File> fileList = new ArrayList<File>();
    PDFAdapter obj_adapter;
    public static int REQUEST_PERMISSIONS = 1;
    boolean boolean_permission;
    File dir;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    init();
    
    }
    
    private void init() {
    
    lv_pdf = (ListView) findViewById(R.id.lv_pdf);
    dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
    fn_permission();
    lv_pdf.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
    Intent intent = new Intent(getApplicationContext(), PdfActivity.class);
    intent.putExtra(“position”, i);
    startActivity(intent);
    
    Log.e(“Position”, i + “”);
    }
    });
    }
    
    public ArrayList<File> getfile(File dir) {
    File listFile[] = dir.listFiles();
    if (listFile != null && listFile.length > 0) {
    for (int i = 0; i < listFile.length; i++) {
    
    if (listFile[i].isDirectory()) {
    getfile(listFile[i]);
    
    } else {
    
    boolean booleanpdf = false;
    if (listFile[i].getName().endsWith(“.pdf”)) {
    
    for (int j = 0; j < fileList.size(); j++) {
    if (fileList.get(j).getName().equals(listFile[i].getName())) {
    booleanpdf = true;
    } else {
    
    }
    }
    
    if (booleanpdf) {
    booleanpdf = false;
    } else {
    fileList.add(listFile[i]);
    
    }
    }
    }
    }
    }
    return fileList;
    }
    private void fn_permission() {
    if ((ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {
    
    if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE))) {
    } else {
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
    REQUEST_PERMISSIONS);
    
    }
    } else {
    boolean_permission = true;
    
    getfile(dir);
    
    obj_adapter = new PDFAdapter(getApplicationContext(), fileList);
    lv_pdf.setAdapter(obj_adapter);
    
    }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_PERMISSIONS) {
    
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
    boolean_permission = true;
    getfile(dir);
    
    obj_adapter = new PDFAdapter(getApplicationContext(), fileList);
    lv_pdf.setAdapter(obj_adapter);
    
    } else {
    Toast.makeText(getApplicationContext(), “Please allow the permission”, Toast.LENGTH_LONG).show();
    
    }
    }
    }
    
    }
    

    activity_pdf.xml:

    <?xml version=”1.0″ encoding=”utf-8″?>
    <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
    android:layout_width=”match_parent”
    android:background=”#ffffff”
    android:layout_height=”match_parent”
    android:orientation=”vertical”>
    
    <com.github.barteksc.pdfviewer.PDFView
    android:id=”@+id/pdfView”
    android:layout_margin=”10dp”
    android:layout_width=”match_parent”
    android:layout_height=”match_parent” />
    </LinearLayout>
    

    PdfActivity.java:

    package com.pdffilefromsdcard;
    
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    
    import com.github.barteksc.pdfviewer.PDFView;
    import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener;
    import com.github.barteksc.pdfviewer.listener.OnPageChangeListener;
    import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle;
    import com.shockwave.pdfium.PdfDocument;
    
    import java.io.File;
    import java.util.List;
    
    public class PdfActivity extends AppCompatActivity implements OnPageChangeListener,OnLoadCompleteListener {
    
    PDFView pdfView;
    Integer pageNumber = 0;
    String pdfFileName;
    String TAG=”PdfActivity”;
    int position=-1;
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pdf);
    init();
    }
    
    private void init(){
    pdfView= (PDFView)findViewById(R.id.pdfView);
    position = getIntent().getIntExtra(“position”,-1);
    displayFromSdcard();
    }
    
    private void displayFromSdcard() {
    pdfFileName = MainActivity.fileList.get(position).getName();
    
    pdfView.fromFile(MainActivity.fileList.get(position))
    .defaultPage(pageNumber)
    .enableSwipe(true)
    
    .swipeHorizontal(false)
    .onPageChange(this)
    .enableAnnotationRendering(true)
    .onLoad(this)
    .scrollHandle(new DefaultScrollHandle(this))
    .load();
    }
    @Override
    public void onPageChanged(int page, int pageCount) {
    pageNumber = page;
    setTitle(String.format(“%s %s / %s”, pdfFileName, page + 1, pageCount));
    }
    @Override
    public void loadComplete(int nbPages) {
    PdfDocument.Meta meta = pdfView.getDocumentMeta();
    printBookmarksTree(pdfView.getTableOfContents(), “-“);
    
    }
    
    public void printBookmarksTree(List<PdfDocument.Bookmark> tree, String sep) {
    for (PdfDocument.Bookmark b : tree) {
    
    Log.e(TAG, String.format(“%s %s, p %d”, sep, b.getTitle(), b.getPageIdx()));
    
    if (b.hasChildren()) {
    printBookmarksTree(b.getChildren(), sep + “-“);
    }
    }
    }
    }
    

    Thanks!

    0 讨论(0)
  • 2020-12-02 18:12

    Try this one add this code to your manifest file

     <provider
                android:name="androidx.core.content.FileProvider"
                android:authorities="${applicationId}.provider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/provider_paths"/>
            </provider>
    

    provide your path type path.xml

    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path name="external_files" path="."/>
    </paths>
    

    and add this code to your functionality

    File file = new File(tempPathNameFileString);
    Intent viewPdf = new Intent(Intent.ACTION_VIEW);
    viewPdf.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    Uri URI = FileProvider.getUriForFile(ReportsActivity.this, ReportsActivity.this.getApplicationContext().getPackageName() + ".provider", file);
    viewPdf.setDataAndType(URI, "application/pdf");
    viewPdf.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    ReportsActivity.this.startActivity(viewPdf);
    
    0 讨论(0)
提交回复
热议问题