اشتراک فایل ها-مراحل اشتراک فایل
آن چه در این آموزش فرا می گیرید:
- دریافت درخواست های فایل
- ایجاد Activity انتخاب فایل
- تعریف Activity انتخاب فایل در کد
- اخذ مجوز برای فایل
- به اشتراک گذاشتن فایل
مواردی که باید مطالعه کرده باشید:
- مجوز ها
- طراحی URI
اشتراک فایل ها-مراحل اشتراک فایل
هنگامی که برنامه را پیکربندی کردید که فایل ها را با استفاده از URI به اشتراک بگذارد، می توانید به درخواست های سایر برنامه ها پاسخ بدهید. یک راه برای پاسخ دادن به این درخواست ها عبارت است از فراهم کردن یک واسط انتخاب فایل در برنامه ی سرویس دهنده طوری که سایر برنامه ها بتوانند درخواست به این واسط ارسال کنند. این کار باعث می شود برنامه های کلاینت به کاربر اجازه ی انتخاب فایل از برنامه سرویس دهنده را داشته باشند و URI مربوط به فایل انتخابی را دریافت کنند.
در این آموزش برنامه نویسی اندروید نحوه ی ایجاد یک Activity انتخاب فایل در برنامه توضیح داده شده است. این Activity به درخواست فایل ها پاسخ می دهد.
دریافت درخواست های فایل
برای دریافت درخواست های فایل از برنامه های کلاینت و پاسخ به آن ها از طریق URI، برنامه ی شما می بایست یک Activity انتخاب فایل را فراهم کند.
برنامه های کلاینت این activity را با فراخوانی ()startActivityForResult راه اندازی می کنند.
()startActivityForResult با یک Intent که حاوی یک ACTION_PICK می باشد همراه است.
هنگامی که برنامه ی کلاینت ()startActivityForResult را صدا می زند، برنامه ی شما نتیجه را در قالب یک URI برای فایلی که کاربر انتخاب کرده برای برنامه ی کلاینت ارسال می کند.
ایجاد Activity انتخاب فایل
برای پیکربندی Activity انتخاب فایل، ابتدا سراغ آن Activity در فایل منیفست بروید. ACTION_PICK و CATEGORY_DEFAULT و CATEGORY_OPENABLE را به آن اضافه کنید. همچنین فیلتر های نوع MIME را تعیین نمایید. تکه کد زیر نحوه ی انجام این کار را نشان می دهد:
<manifestxmlns:android="http://schemas.android.com/apk/res/android">
...
<application>
...
<activity
android:name=".FileSelectActivity"
android:label="@"FileSelector" >
<intent-filter>
<action
android:name="android.intent.action.PICK"/>
<category
android:name="android.intent.category.DEFAULT"/>
<category
android:name="android.intent.category.OPENABLE"/>
<dataandroid:mimeType="text/plain"/>
<dataandroid:mimeType="image/*"/>
</intent-filter>
</activity>
تعریف Activity انتخاب فایل در کد
مرحله ی بعدی، تعریف کلاس Activity می باشد. این کلاس فایل های موجود برنامه ی شما که داخل دایرکتوری files/images قرار دارند را نشان می دهد و اجازه می دهد که کاربر فایل های مورد نظرش را انتخاب کند. کد زیر تعریف این کلاس Activity را نمایش می دهد و به درخواست های انتخاب فایل کاربر پاسخ می دهد:
تعریف کلاس Activity
public class MainActivity extends Activity{
// مسیر ریشه ی حافظه ی داخلی برنامه
private File mPrivateRootDir;
//مسیر دایرکتوری تصاویر برنامه
private File mImagesDir;
// آرایه ای از فایل های تصاویر
File[] mImageFiles;
//آرایه ی نام های منطبق با تصاویر
String[] mImageFilenames;
// مقدار دهی اولیه اکتیویتی
@Override
protected void onCreate(Bundle savedInstanceState){
...
// پیکربندی یک اینتنت به نحوی که فایل درخواستی را برگرداند
mResultIntent =
newIntent(>"com.example.myapp.ACTION_RETURN_FILE");
// برگرداندن زیردایرکتوری های حافظه ی داخلی
mPrivateRootDir = getFilesDir();
//برگرداندن دایرکتوری تصاویر
mImagesDir =newFile(mPrivateRootDir,>"images");
//برگرداندن لیست تصاویر داخل دایرکتوری تصاویر برنامه
mImageFiles = mImagesDir.listFiles();
//مقدار دهی نال به اکتیویتی
setResult(Activity.RESULT_CANCELED,null);
/*
* Display the file names in the ListView mFileListView.
* Back the ListView with the array mImageFilenames, which
* you can create by iterating through mImageFiles and
* calling File.getAbsolutePath() for each File
*/
...
}
...
}
پاسخ به انتخاب فایل
هنگامی که کاربر فایل به اشتراک گذاشته را انتخاب می کند، برنامه ی شما می بایست مشخص کند که چه فایلی انتخاب شده است و برای آن فایل URI تولید کند. از آنجایی که Activity لیست فایل های در دسترس را در یک listView نمایش می دهد، هنگامی که کاربر روی نام فایل کلیک کرد، سیستم متد ()onItemClick را فراخوانی می کند. با استفاده از این متد می توانید فایل انتخاب شده را دریافت کنید.
در متد ()onItemClick، شیء File را برای نام فایل های انتخابی دریافت کنید و آن را به عنوان آرگومان به همراه مجوزی که در عنصر <provider> مشخص کردید، به متد ()getUriForFile ارسال نمایید.
URI نتیجه حاوی مجوز، سگمنت مسیر منطبق با دایرکتوری فایل و نام فایل و پسوند آن می باشد.
تکه کد زیر به شما نحوه ی تشخیص فایل های انتخابی و دریافت URI را برای آن نشان می دهد:
protectedvoid onCreate(Bundle savedInstanceState){
...
// Define a listener that responds to clicks on a file in the ListView
mFileListView.setOnItemClickListener(
newAdapterView.OnItemClickListener(){
@Override
/*
* When a filename in the ListView is clicked, get its
* content URI and send it to the requesting app
*/
publicvoid onItemClick(AdapterView<?> adapterView,
View view,
int position,
long rowId){
/*
* Get a File for the selected file name.
* Assume that the file names are in the
* mImageFilename array.
*/
File requestFile =newFile(mImageFilename[position]);
/*
* Most file-related method calls need to be in
* try-catch blocks.
*/
// Use the FileProvider to get a content URI
try{
fileUri =FileProvider.getUriForFile(
MainActivity.this,
>"com.example.myapp.fileprovider",
requestFile);
}catch(IllegalArgumentException e){
Log.e(>"File Selector",
>"The selected file can't be shared: "+
clickedFilename);
}
...
}
});
...
}
به خاطر داشته باشید که تنها می توانیم برای فایل هایی URI تولید کنیم که در دایرکتوری هایی که در عنصر <path> تعریف کردیم وجود داشته باشند. نحوه ی تعریف این دایرکتوری ها در آموزش اندروید قبلی یعنی اشتراک فایل ها-پیکربندی توضیح داده شد. اگر ()getUriForFile را برای یک فایل که در مسیر مورد نظر وجود ندارد صدا بزنید، خطای IllegalArgumentException دریافت می کنید.
اخذ مجوز برای فایل
حالا که یک URI برای فایلی که می خواهید به اشتراک بگذارید از برنامه های دیگر دریافت کردید، نیاز است تا به برنامه ی کلاینت اجازه ی دسترسی به آن فایل را صادر کنید. برای اجازه ی دسترسی، با استفاده از افزودن URI به Intent و سپس تنظیم پرچم های Intetn، مجوزهای لازم را به برنامه ی کلاینت بدهید. مجوزی که اخذ می کنید موقتی است و بلافاصله بعد از این که برنامه به حالت اتمام رفت این مجوز ابطال می شود.
تکه کد زیر نحوه ی تنظیم مجوز خواندن برای یک فایل را نمایش می دهد:
protected void onCreate(Bundle savedInstanceState){
...
// Define a listener that responds to clicks in the ListView
mFileListView.setOnItemClickListener(
newAdapterView.OnItemClickListener(){
@Override
publicvoid onItemClick(AdapterView<?> adapterView,
View view,
int position,
long rowId){
...
if(fileUri !=null){
// Grant temporary read permission to the content URI
mResultIntent.addFlags(
Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
...
}
...
});
...
}
به اشتراک گذاشتن فایل با برنامه ی درخواست کننده
برای اشتراک فایل ها با برنامه ای که آن ها را دریافت کرده است، Intentی که خاوی URI و مجوزهای لازم است را به ()setResult ارسال کنید. هنگامی که Activity خاتمه یافت، سیستم Intent را به برنامه ی کلاینت می فرستد. تکه کد زیر نحوه ی انجام کار را نمایش می دهد:
protected void onCreate(Bundle savedInstanceState){
...
// Define a listener that responds to clicks on a file in the ListView
mFileListView.setOnItemClickListener(
newAdapterView.OnItemClickListener(){
@Override
publicvoid onItemClick(AdapterView<?> adapterView,
View view,
int position,
long rowId){
...
if(fileUri !=null){
...
// Put the Uri and MIME type in the result Intent
mResultIntent.setDataAndType(
fileUri,
getContentResolver().getType(fileUri));
// Set the result
MainActivity.this.setResult(Activity.RESULT_OK,
mResultIntent);
}else{
mResultIntent.setDataAndType(null,>"");
MainActivity.this.setResult(RESULT_CANCELED,
mResultIntent);
}
}
});
برای کاربران مسیری را مهیا کهنید که بلافاصله بعد از اینکه فایل را انتخاب کردند به برنامه ی کلاینت برگردند. یک راه برای انجام این کار استفاده از دکمه ی Done یا انجام شد می باشد. دکمه را با استفاده از خصوصیت android:onclick به یک متد انتساب دهید. در متد تابع ()finish را فراخوانی نمایید:
public void onDoneClick(View v){
// Associate a method with the Done button
finish();
}
- نوشته شده توسط مظاهر نصوحی
- بازدید: 7604