Bu dersimizde external storage üzerindeki public dosyalarla çalışırken gerekli olan izinleri kullanıcıdan çalışma anında almayı ve de bir işlem yapmadan önce external storage’ın erişebilirliğini kontrol etmeyi öğreneceğiz.
Daha önceki derste de anlatıldığı gibi api 23 ve sonrasındaki cihazlarda external storage üzerinde işlem yapmak için kullanıcıdan izin istenmelidir. Runtime permission konusu temel eğitim setinde ayrıntılı bir şekilde anlatılmıştır. Bu derste aşağıdaki linkteki yazıdan faydalanılmıştır.
47 Runtime Permission Pratik Yöntem | Android 7 Nougat Temel Eğitim Seti
Bu sistemin işleyişi kısaca şu şekildedir.
MainActivity’de izin alındığı zaman yapılacak işlemler bir method içine alınır. Daha sonra istenilen izinler belirtilerek RuntimeIzinlerActivity sınıfındaki izinIste() methoduna bir request kod ile String dizi olarak yollanır.
1 2 3 |
String[] istenilenIzinler={Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}; MainActivity.super.izinIste(istenilenIzinler, EXTERNAL_STORAGE_IZINLERI); |
Bu izinler kullanıcıdan istenir. Eğer kullanıcı burada belirtilen tüm izinleri vermiş ise yine MainActivity.java dosyasındaki izinVerildi() methodu tetiklenir. Bu method izin istenirken gönderilen request kodla beraber çalıştırılır. Yani bu methodun çalıştırılması demek istenilen tüm izinlerin verilmiş olduğu anlamına gelir. Bu yüzden izin alındığı zaman yapılacak işlemler içine aldığımız methodun çalıştırılmasını burada yaparız.
1 2 3 4 5 6 7 8 9 10 |
@Override public void izinVerildi(int requestCode) { if(requestCode == EXTERNAL_STORAGE_IZINLERI){ externalStorageIslemleri(); } } |
External Storage her zaman ulaşılabilir olmayabilir, bu yüzden dosya oluşturma veya dosya okuma işlemlerini yapmadan önce durumunu kontrol etmek gerekir. Bu yüzden external storage’ımızın okumaya veya yazmaya erişilebilirliğini kontrol eden methodlar oluşturduk.
EXTERNAL STORAGE YAZMAYA UYGUN
1 2 3 4 5 6 7 8 9 |
public boolean externalStorageYazilabilir(){ String durum=Environment.getExternalStorageState(); if(Environment.MEDIA_MOUNTED.equals(durum)){ return true; } return false; } |
EXTERNAL STORAGE EN AZINDAN OKUMAYA UYGUN
1 2 3 4 5 6 7 8 9 10 |
public boolean externalStorageOkunabilir(){ String durum=Environment.getExternalStorageState(); if(Environment.MEDIA_MOUNTED.equals(durum) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(durum)){ return true; } return false; } |
Şuana kadar gördüğümüz kavramları tek bir resimde gösterirsek daha iyi anlaşılacaktır.
Bu ders ile beraber android file system yani internal ve external storage kavramları tüm detaylarıyla işlenmiştir. Böylece persistent data konusunun sharedpreferences, internal storage, external storage kısımlarını tamamlamış olduk.
Bu derste yazılan kodlar aşağıdaki gibidir. AndroidFileSystemOrnek projesinin bitmiş son halini buradaki linkten indirebilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
import android.os.Bundle; import android.os.Environment; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class ExternalStorageDemo extends AppCompatActivity { private EditText etExternalPrivate, etExternalPublic; private TextView txvExternalPrivate, txvExternalPublic; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.external_storage); etExternalPrivate = (EditText) findViewById(R.id.etExternalPrivate); etExternalPublic = (EditText) findViewById(R.id.etExternalPublic); txvExternalPrivate = (TextView) findViewById(R.id.txvExternalPrivate); txvExternalPublic = (TextView) findViewById(R.id.txvExternalPublic); } public void saveToExternalPrivate(View view) { String data=etExternalPrivate.getText().toString(); File dosyaDizini=getExternalFilesDir("myFolder"); File dosya=new File(dosyaDizini, "myExternalPrivate.txt"); writeToFile(dosya, data); } public void saveToExternalPublic(View view) { String data=etExternalPublic.getText().toString(); if(externalStorageYazilabilir()) { //File dosyaYolu=Environment.getExternalStoragePublicDirectory("kendiKlasorum"); File dosyaYolu = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File file = new File(dosyaYolu, "myExternalPublic.txt"); writeToFile(file, data); }else { Toast.makeText(this, "External Storage Ulaşılamaz", Toast.LENGTH_SHORT).show(); } } public void loadFromExternalPrivate(View view) { if(externalStorageOkunabilir()) { File dosyaDizini = getExternalFilesDir("myFolder"); File dosya = new File(dosyaDizini, "myExternalPrivate.txt"); String dosyaIcerigi = readFromFile(dosya); txvExternalPrivate.setText(dosyaIcerigi); }else { Toast.makeText(this, "External Storage Ulaşılamaz", Toast.LENGTH_SHORT).show(); } } public void loadFromExternalPublic(View view) { File dosyaYolu=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File dosya=new File(dosyaYolu, "myExternalPublic.txt"); String dosyaIcerigi=readFromFile(dosya); txvExternalPublic.setText(dosyaIcerigi); } private void writeToFile(File file, String data){ FileOutputStream fos = null; try { fos = new FileOutputStream(file); fos.write(data.getBytes()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); Toast.makeText(this, "Dosyaya Yazıldı", Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } } } } private String readFromFile(File veriOkunacakDosya){ StringBuffer buffer=new StringBuffer(); FileInputStream fis=null; try { fis=new FileInputStream(veriOkunacakDosya); int read; while((read = fis.read()) != -1){ buffer.append((char) read); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { if(fis != null){ try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } return buffer.toString(); } public boolean externalStorageYazilabilir(){ String durum=Environment.getExternalStorageState(); if(Environment.MEDIA_MOUNTED.equals(durum)){ return true; } return false; } public boolean externalStorageOkunabilir(){ String durum=Environment.getExternalStorageState(); if(Environment.MEDIA_MOUNTED.equals(durum) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(durum)){ return true; } return false; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="10dp" tools:context="com.example.emrealtunbilek.androidfilesystemornek.ExternalStorageDemo"> <EditText android:id="@+id/etExternalPrivate" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="External Private Data" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="saveToExternalPrivate" android:text="External Private Kaydet" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="loadFromExternalPrivate" android:text="External Private Verı Getir" /> <TextView android:id="@+id/txvExternalPrivate" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="Dosya İçeriği" android:textColor="@android:color/black" android:textSize="18sp" /> <EditText android:id="@+id/etExternalPublic" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="50dp" android:hint="External Public Data" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="saveToExternalPublic" android:text="External Public kaydet" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="loadFromExternalPublic" android:text="External Public veri getir" /> <TextView android:id="@+id/txvExternalPublic" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="Dosya İçeriği" android:textColor="@android:color/black" android:textSize="18sp" /> </LinearLayout> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
public class MainActivity extends RuntimeIzinlerActivity { private static int EXTERNAL_STORAGE_IZINLERI= 50; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void izinVerildi(int requestCode) { if(requestCode == EXTERNAL_STORAGE_IZINLERI){ externalStorageIslemleri(); } } public void openInternalStorageDemoActivity(View view) { Intent intent=new Intent(this, InternalStorageDemo.class); startActivity(intent); } public void openCacheStorageDemoActivity(View view) { Intent intent=new Intent(this, CacheStorageDemo.class); startActivity(intent); } public void openExternalStorageDemoActivity(View view) { String[] istenilenIzinler={Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}; MainActivity.super.izinIste(istenilenIzinler, EXTERNAL_STORAGE_IZINLERI); } public void externalStorageIslemleri(){ Intent intent=new Intent(this, ExternalStorageDemo.class); startActivity(intent); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="10dp" tools:context="com.example.emrealtunbilek.androidfilesystemornek.MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Internal Storage Demo" android:onClick="openInternalStorageDemoActivity"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Cache Storage Demo" android:onClick="openCacheStorageDemoActivity"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="External Storage Demo" android:onClick="openExternalStorageDemoActivity"/> </LinearLayout> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
package com.example.emrealtunbilek.androidfilesystemornek; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; public abstract class RuntimeIzinlerActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } public void izinIste(final String[] istenilenIzinler, final int requestCode) { int izinKontrol = PackageManager.PERMISSION_GRANTED; boolean mazeretGoster = false; //izinkontrol=0 ise izin/izinler verilmiştir //aksi durumda izin/izinler verilmemiştir. //mazeret göster = false ise ilk defa izin sorulmustur //mazeret goster= true ise kullanıcı izni reddetmiştir, ona bir mazeret sunabiliriz. for (String izin : istenilenIzinler) { izinKontrol = izinKontrol + ContextCompat.checkSelfPermission(this, izin); mazeretGoster = mazeretGoster || ActivityCompat.shouldShowRequestPermissionRationale(this, izin); } if (izinKontrol != PackageManager.PERMISSION_GRANTED) { if (mazeretGoster) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Neden İzin Vermelisin?"); builder.setMessage("External Storage üzerinde işlem yapmak istiyorsan bu izni vermen gerekiyor"); builder.setNegativeButton("IZIN YOK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.setPositiveButton("IZIN VERMEK ISTIYORUM", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityCompat.requestPermissions(RuntimeIzinlerActivity.this, istenilenIzinler, requestCode); } }); builder.show(); } else { ActivityCompat.requestPermissions(RuntimeIzinlerActivity.this, istenilenIzinler, requestCode); } } else { izinVerildi(requestCode); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); int izinKontrol = PackageManager.PERMISSION_GRANTED; //izinkontrol=0 ise tüm izinler verilmiştir for (int izinDurumu : grantResults) { izinKontrol = izinKontrol + izinDurumu; } if ((grantResults.length > 0) && izinKontrol == PackageManager.PERMISSION_GRANTED) { izinVerildi(requestCode); } else { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("STORAGE IZNI GEREKLI"); builder.setMessage("Ayarladan storage ile ilgili tüm izinleri vermen gerekiyor"); builder.setNegativeButton("IZIN YOK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.setPositiveButton("IZIN VER", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setData(Uri.parse("package:" + getPackageName())); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); startActivity(intent); } }); builder.show(); } } public abstract void izinVerildi(int requestCode); } |