خواندن و نوشتن فایل بدون استفاده از توابع خود اندروید نیاز به حق دسترسی دارد که در برخی موارد اگر کاربر حق دسترسی به اپلیکیشن را ندهد، کارکرد اپلیکیشن دچار مشکل خواهد شد.
ما در اینجا قصد داریم روشی را آموزش دهیم که از توابع خود اندروید استفاده می کند و نیازی حق دسترسی ندارد زیرا اندروید مطمئن هست که این نوع دسترسی به فایل فقط از طریق کاربر میتواند باشد.
فایلها یکی از مواردی هستند که در همه زبانهای برنامه نویسی برای دسترسی به فایلها و خواندن و نوشتن اطلاعات در فایلها، توابعی تعریف کرده اند و اندروید هم از این قضیه مستثنا نیست.
یکی از روشهای خواندن فایل در اندروید استفاده از Intent می باشد. کار با فایلها در اندروید نیاز به حق دسترسی دارد اما در این روش نیازی به استفاده از حق دسترسی (permission) خواندن در AndroidManifest.xml نمی باشد زیرا از سیستم خود اندروید استفاده شده است.
در این روش ما با استفاده از فراخوانی Intent و برگشت دادن نتیجه به Activity می توانیم فایل ها را بخوانیم.
مزیتهایی که برای این کار می توان بر شمرد، یکی امنیت بالای آن می باشد زیرا از خود دستورات اندروید برای این کار استفاده می کنیم و دیگری نیز راحتی آن می باشد. با این روش کد نویسی بشدت کاهش می یابد که باعث کاهش خطا هم می شود.
خواندن فایل در اندروید
برای خواندن فایل در اندروید اول در متغیر PICK_FILE کد فراخوانی و دریافت Intent را مشخص می کنیم.
سپس Intent را با کد مربوطه فراخوانی می کنیم. عدد این کد می تواند هر عددی باشد فقط نباید در کدها از عدد مشابه برای کار دیگری استفاده کرد و اگر نه داده های برگشتی اشتباه پردازش خواهند شد.
public class MainActivity extends AppCompatActivity {
public static int PICK_FILE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("text/plain");
startActivityForResult(intent, PICK_FILE);
}
سپس نتیجه برگشت Intent را می خوانیم و در فایل متنی ذخیره می کنیم.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_FILE) {
if (resultCode == RESULT_OK) { // User pick the file Uri
uri = data.getData();
String fileContent = readTextFile(uri);
Toast.makeText(this, fileContent, Toast.LENGTH_LONG).show();
try { //Read file into InputStream
InputStream is = getContentResolver().openInputStream(uri);
Toast.makeText(this, is.available()+"", Toast.LENGTH_LONG).show();
} catch (Exception e){ }
} else {
Log.e("MainActivity", data.toString());
}
}
}
private String readTextFile(Uri uri){
BufferedReader reader = null;
StringBuilder builder = new StringBuilder();
try {
reader = new BufferedReader(new InputStreamReader(getContentResolver().openInputStream(uri)));
String line = "";
while ((line = reader.readLine()) != null) {
builder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return builder.toString();
}
}
نکته: این کد فقط برای خواندن فایل متنی نوشته شده است. اما می توان برای خواندن هر فایلی استفاده کرد. برای این منظور در قسمت دوم کد، فایل را خوانده و در InputStream قرار می دهد.
این فایل هر نوع فایلی می تواند باشد و می توانید عملیات مربوط به InputStream را انجام دهید، مانند اینکه اگر فایل تصویر باشد می توانید آن را ذخیره نمایید. اما باید intent.setType(“text/plain”) را به نوع فایل مربوطه تغییر دهید.
این روش راحت ترین و ایمن ترین روش برای خواندن فایل در اندروید می باشد که می توان از آن برای خواندن فایلهای موجود در حافظه دستگاه و حافظه مموری استفاده کرد و برای این کار محدودیتی وجود ندارد.