18 April 2013

การใช้ Intent เพื่อเปิดไฟล์ด้วยแอปอื่นๆ

Updated on


        บทความนี้ก็เป็นอีกบทความหนึ่งที่มีความสำคัญสำหรับ Intent เพราะจะเป็นการเปิดไฟล์ต่างๆ ด้วยการใช้คลาส Intent แทน เพราะไม่ต้องมานั่งเขียนโปรแกรมเพื่อเปิดไฟล์นั้นๆ เอง แต่จะส่งไฟล์นั้นๆ ไปเปิดบนแอพอื่นที่รองรับแทน

        สำหรับคราวนี้การกำหนด File Type จะกำหนดตามนามสกุลไฟล์ เพราะไม่เหมือนกับการแชร์ไฟล์กำหนดได้หลายๆ แบบ แต่การ View จะต้องกำหนดให้ตรงกับนามสกุลไฟล์เท่านั้น

Uri uri = Uri.fromFile(new File("file:///sdcard/tmp/image_logo.png"));
Intent intent = new Intent(Intent.ACTION_VIEW);
String mimeType = MimeTypeMap.getSingleton()
        .getMimeTypeFromExtension(MimeTypeMap
                .getFileExtensionFromUrl(file.getPath()));
intent.setDataAndType(uri, mimeType);
startActivity(Intent.createChooser(intent, "Open file with"));





        โดยตัวอย่างนี้ก็จะใช้วิธีแบบเดิม คือเก็บไฟล์ไว้ที่โฟลเดอร์ assets พอจะนำมาเปิด จะให้ก๊อปไฟล์ไปไว้ใน External Storage หรือ SD ก่อน จากนั้นจึงกำหนดที่อยู่ไฟล์ให้กับ Intent เพื่อแสดงรายชื่อแอพที่จะเปิด


แต่ในการใช้งานจริงไฟล์ควรจะอยู่ใน External Storage หรือ SD เจ้าของบล็อกจึงได้ทำโค๊ดไว้ให้แล้วอีกชุด ในกรณีดังกล่าวจะใส่คอมเม้นไว้ให้ ส่วนการดึงจาก assets เป็นแค่ตัวอย่าง เพื่อที่ผู้ที่หลงเข้ามาอ่านจะได้ไม่ต้องมานั่งก๊อปไฟล์ลงเครื่องเอง

        และเนื่องจากมีคำสั่งก๊อปไฟล์ลง External หรือ SD ในตัวอย่างนี้ด้วย ดังนั้นจึงต้องมีการประกาศ Permission เพื่อขอใช้งานดังกล่าวเช่นกัน โดยให้ประกาศไว้ใน AndroidManifest.xml (ทุกๆ Permission ประกาศที่นี่)

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">

        บทความนี้จะอธิบายน้อยหน่อย เพราะถือว่าเคยอธิบายไปแล้ว และในบทความนี้แตกต่างกันเล็กน้อย โดยโค๊ดทั้งหมดก็จะเป็นดังนี้


main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/buttonIntent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Open" />

</RelativeLayout>

Main.java
package app.akexorcist.intentviewfile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.MimeTypeMap;
import android.widget.Button;

public class Main extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        /**** Document from assets ****/
        //final File file = assetToFile("worksheet/image_logo.png");
        //final File file = assetToFile("worksheet/doc.docx");
        //final File file = assetToFile("worksheet/IRF740.pdf");
        //final File file = assetToFile("sound_effect.mp3");
        final File file = assetToFile("my_video.mp4");
        
        /**** Document from external storage (SD Card) ****/
        //final File file = new File("file:///sdcard/tmp/image_logo.png");
        //final File file = new File("file:///sdcard/tmp/doc.docx");
        //final File file = new File("file:///sdcard/tmp/IRF740.pdf");
        //final File file = new File("file:///sdcard/tmp/sound_effect.mp3");
        //final File file = new File("file:///sdcard/tmp/my_video.mp4");
        
        Button buttonIntent = (Button)findViewById(R.id.buttonIntent);
        buttonIntent.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                String mimeType = MimeTypeMap.getSingleton()
                        .getMimeTypeFromExtension(MimeTypeMap
                                .getFileExtensionFromUrl(file.getPath()));
                intent.setDataAndType(Uri.fromFile(file), mimeType);
                startActivity(Intent.createChooser(intent, "Open file with"));
            }
        });
    }
    
    public File assetToFile(String filePath) {
        new File(Environment.getExternalStorageDirectory().getAbsolutePath()
                , "tmp").mkdir();
        String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
        File file = new File(Environment.getExternalStorageDirectory()
                , "tmp/" + fileName);
        
        try {
            InputStream is = getResources().getAssets().open(filePath);
            OutputStream out = new FileOutputStream(file);
            byte[] buffer = new byte[is.available()];
            is.read(buffer);
            out.write(buffer, 0, buffer.length);
            is.close();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }
}

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="app.akexorcist.intentviewfile"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="8" />
    
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="app.akexorcist.intentviewfile.Main"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

        สำหรับผู้ที่หลงเข้ามาอ่านคนใดที่ต้องการไฟล์ตัวอย่างสามารถดาวน์โหลดได้จาก Intent View File [Google Play]



บทความที่เกี่ยวข้อง

        การใช้ Intent สำหรับแชร์ข้อความ String [Send]
        การใช้ Intent สำหรับแชร์ข้อความสำหรับ Email [Send]
        การใช้ Intent เพื่อเปิด URL [View]
        การใช้ Intent เพื่อเปิดแผนที่ [View]
        การใช้ Intent เพื่อเปิดไฟล์ใดๆ [View]
        การเรียกเปิดแอพฯอื่นๆ ด้วย Intent
        การใช้ Intent สำหรับแชร์ไฟล์ใดๆ [Send]
        การเลือกไฟล์ภาพจาก Gallery ด้วย Intent [Result]
        การใช้งานกล้องเพื่อถ่ายภาพแบบง่ายๆด้วย Intent [Result]
        การใช้งานกล้องเพื่อบันทึกวีดีโอแบบง่ายๆด้วย Intent [Result]
        การอ่าน QR Code และ Barcode ด้วย Intent [Result]
        การรับข้อมูล Intent จากแอพฯอื่นๆ [Get Content]
        การรับข้อมูล Intent จากแอพฯอื่นแล้วส่งข้อมูลกลับไป [Result Content]