Android Uygulamasına Browsable Özelliği Eklemek

14-03-2014
Bazı durumlarda yaptığımız Android uygulamasının belirli dosyaları açabilme özelliğine ihtiyaç duyarız. Böyle bir durumda yapılması gereken, uygulamamızdaki bir Activity sınıfına bu özelliği kazandırmaktır. Ayrıca default olarak bizim uygulamamızın seçilmesini sağlayarak dilediğimiz dosya türlerinin direkt açılmasını sağlayabiliriz. Bu uygulamayı geliştirmek için şimdi gerekli adımları yazalım.


İlk Önce Activity Sınıfını Tanımlayalım

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import android.widget.TextView;
 
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class MainActivity extends Activity {
 
    private Uri mURI;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        final Intent intent = getIntent();
        final String action = intent.getAction();
 
        //View action olup olmadigini yani bir dosyayi bizim uygulamamizla acilip acilmadigini kontrol ediyor
        if (Intent.ACTION_VIEW.equals(action)) {
            //uri = intent.getStringExtra("URI");
            mURI = intent.getData(); //Bir Uri nesnesi donderir
 
            try {
                String content = getPublicFileContent(mURI.getPath());
                EditText txtMain = (EditText) findViewById(R.id.txtMain);
                txtMain.setText(content, TextView.BufferType.EDITABLE);
 
            } catch (IOException e) {
                e.printStackTrace();
            }
            // now you call whatever function your app uses
            // to consume the txt file whose location you now know
        } else {
            Log.d("IsBrowsable", "intent browsable degil " + action);
        }
    }
 
    private String getPublicFileContent(String path) throws IOException {
        StringBuilder text = new StringBuilder();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"));
            String line;
 
            while ((line = br.readLine()) != null) {
                text.append(line);
                text.append('\n');
            }
 
        } catch (IOException e) {
            Log.e("DosyaAcilamadi","Dosya acilirken hata olustu. "+e.getMessage());
        }
        return text.toString();
 
    }
}


res/values/strings.xml dosyası

<resources>
    <string name="app_name">Browsable Edit</string>
</resources>


res/layout/activity_main.xml dosyası

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/mainLayout"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    <EditText
            android:id="@+id/txtMain"
            android:inputType="textMultiLine"
 
            android:minLines="6"
            android:gravity="top|left"
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:scrollbars="vertical"
            />
</LinearLayout>


AndroidManifest.xml dosyası

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="mucayufa.android.browsable"
          android:versionCode="1"
          android:versionName="1.0">
    <uses-sdk android:minSdkVersion="14"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <application android:label="@string/app_name" android:icon="@drawable/icon">
        <activity android:name=".MainActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="file"/>
                <data android:mimeType="*/*"/>
                <data android:pathPattern=".*\\.txt"/>
                <data android:pathPattern=".*\\.php"/>
                <data android:pathPattern=".*\\.go"/>
                <data android:pathPattern=".*\\.java"/>
                <data android:pathPattern=".*\\.py"/>
                <data android:pathPattern=".*\\.bat"/>
                <data android:pathPattern=".*\\.cs"/>
                <data android:pathPattern=".*\\.asp"/>
                <data android:pathPattern=".*\\.aspx"/>
                <data android:pathPattern=".*\\.xhtml"/>
                <data android:pathPattern=".*\\.phtml"/>
                <data android:pathPattern=".*\\.jsp"/>
                <data android:pathPattern=".*\\.js"/>
                <data android:pathPattern=".*\\.css"/>
                <data android:pathPattern=".*\\.c"/>
                <data android:pathPattern=".*\\.cpp"/>
                <data android:host="*" /> <!--pathPattern ile belirtilen dosya tiplerinde calismasi icin gerekli-->
            </intent-filter>
        </activity>
    </application>
</manifest>

AndroidManifest.xml dosyasında iki tane intent-filter tag bulunmaktadır. Eğer tek bir tane intent-filter tag ekleyip, alttaki intent-filter içeriğini bu intent-filter tag içerisine eklersek MainActivity isimli sınıfımız browsable olmaz. Bu nedenle yukarıda gösterildiği gibi iki tane intent-filter eklemek gerekmektedir. İlk intent-filter'da MainActivity sınıfının ana Activity olduğunu ifade ediyoruz. Uygulamamız bu sınıftan başlıyor.

İkinci intent-filter ile de aynı MainActivity sınıfının VIEW, DEFAULT ve BROWSABLE olacağını ifade ediyoruz. Burada VIEW kullanılarak, MainActivity activity'nin bir dosyaya tıklandığında Android işletim sisteminin bu activity'i de göstermesini sağlıyoruz. DEFAULT ile uygulamamızın seçilen dosya için, eğer kullanıcı tarafından seçilirse, default yani varsayılan olmasını sağlıyoruz.

<data android:scheme="file"/> ile bir URL değil, sadece yerel dosyalar açılabileceğini sağlıyoruz.
<data android:mimeType="*/*"/> ile birden çok dosya farklı mimeType sahip olduğu için tüm mimeType'lerin temsil edilmesi için ekliyoruz.
<data android:pathPattern=".*\\.txt"/> ve diğer pathPattern elementleri ile her dosya türü için değil sadece belirtilen dosya türleri için açılmasını sağlıyoruz.
<data android:host="*" /> pathPattern ile belirtilen dosya tiplerinde çalışması için, bu elementi eklemek gereklidir. Eğer bu elementi eklemeseydik uygulamamız tüm dosyaları açmaya çalışırdı.

© 2019 Tüm Hakları Saklıdır. Codesenior.COM