کپی کردن یک فایل از پوشه raw در پروژه اندروید به درون پوشه ای در حافظه خارجی (External Storage)، در برنامه نویسی اندروید
فرض کنید که یک فایل دلخواه (هر نوع فایلی) را درون پوشه raw از پروژه اندروید داشته باشیم و بخواهیم که آن را به درون پوشه ای درون حافظه خارجی (External Storage) کپی کنیم. مثلا فرض می کنیم که فایل مورد نظرمان، دارای نام my_file.mp3 می باشد :
با فرض اینکه بخواهیم فایل با نام جدید defaultName.mp3 و در پوشه ای با نام myFolder در حافظه خارجی (External Storage) کپی شود، کدهای زیر را می نویسیم :
String folderName = "/myFolder";
File dir = new File (root.getAbsolutePath() + folderName);
if(!dir.exists()) {
dir.mkdirs(); // build directory
}
InputStream in = getResources().openRawResource(R.raw.my_file);
String filename = "defaultName.mp3";
File f = new File(root + folderName , filename);
if(!f.exists()){
try {
OutputStream out = new FileOutputStream(f);
byte[] buffer = new byte[1024];
int len;
while((len = in.read(buffer, 0, buffer.length)) != -1){
out.write(buffer, 0, len);
}
in.close();
out.close();
} catch (FileNotFoundException e) {
//
} catch (IOException e) {
//
}
}
دقت شود که در صورت کدنویسی برای فرآیندی که نیاز به دسترسی به حافظه خارجی (External Storage) دارد، باید کدهای زیر درون AndroidManifest.xml نوشته شود (برای اجازه دادن برای نوشتن در حافظه خارجی و یا خواندن از حافظه خارجی) :
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
برای درک موقعیت قرارگیری کد بالا در فایل AndroidManifest.xml از پروژه اندروید، کدهایی را به عنوان مثالی از کدهای فایل AndroidManifest.xml در زیر ذکر کرده ایم :
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.kelidestan.com"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.kelidestan.com.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.kelidestan.com.Activity_2"
android:label="@string/title_activity_activity_2" >
</activity>
<activity
android:name="com.kelidestan.com.Activity_3"
android:label="@string/title_activity_activity_3" >
</activity>
</application>
</manifest>
توضیحات بیشتر در مورد کدها :
با استفاده از کد زیر، آدرس مسیر حافظه خارجی (external storage) را به دست آورده ایم ( آموزش شماره 279 ) :
نام پوشه ای که باید فایل در آن کپی شود را در خط زیر تعیین کرده ایم :
با کد زیر، مسیر کامل پوشه را به صورت متغیر File خواهیم داشت :
با کدهای زیر، تعیین کرده ایم که اگر پوشه مورد نظر وجود ندارد، ساخته شود ( آموزش شماره 280 ) :
dir.mkdirs(); // build directory
}
فایلی که قصد داریم کپی شود را در خط زیر مشخص کرده ایم (از پوشه raw) :
و نام مورد نظرمان برای فایلی که از آن کپی می شود (ساخته می شود) را در خط زیر از کدها مشخص کرده ایم :
و مسیر کامل آن را به صورت زیر، در یک متغیر از نوع File مشخص کرده ایم :
سپس با کدهای زیر تعیین کرده ایم که اگر فایل در مسیر تعیین شده، وجود ندارد، ساخته شود (کپی شود) :
try {
OutputStream out = new FileOutputStream(f);
byte[] buffer = new byte[1024];
int len;
while((len = in.read(buffer, 0, buffer.length)) != -1){
out.write(buffer, 0, len);
}
in.close();
out.close();
} catch (FileNotFoundException e) {
//
} catch (IOException e) {
//
}
}
در کدهای فوق، از try و catch استفاده شده است که به منظور عدم ایجاد Force Close (بسته شدن برنامه) هنگام مواجه شدن با خطا به کار می رود ( آموزش شماره 345 ).
خیلی ممنون ولی چطوری از حافظه خارجی به خارجی بفرستم؟
سلام
من دارم با xamarin می نویسم
اینAndroidManifest.xml تو زمارین همون Strings.xml میشه دیگه؟
سلام.
بنده تاکنون با xamarin کار نکردم، اما فایل های AndroidManifest.xml و Strings.xml ، کاملا متفاوت هستند و برای دو هدف مختلف به کار می روند.
در AndroidManifest.xml ، برخی ویژگی های اصلی برنامه اندروید را تعریف می کنیم (مثلا لیست Activity ها و Service ها و permission ها و ... در آن ذکر می شود)، اما در فایل Strings.xml ، رشته های (متن های - Strings) مورد نظرمان برای برنامه اندروید را تعریف می کنیم که بعدا در کدهای پروژه اندروید، به آنها ارجاع داده می شود.
سلام
مرسی از پاسخ که به من دادید
می خوام یک برنامه را از داخل برنامه دیگر نصب کنم این دستوراتی که شما گذاشته اید عالی بود و نکته این که حال اگر بخوام از من سوال نکنه و من بدون پرسیدن از apk بعدی نصب کنم از چه دستوری باید استفاده کنم؟
یعنی اگر apk دیگر داخل برنامه اجرا کردن مراحل نصب نپرسه مستقیم با هموم بار اول که اجازه داده شد نصب بشه؟
با تشکر
سلام.
معمولا فایل apk در برنامه اصلی قرار می گیرد و بعد از نصب برنامه اصلی، فایل apk را با یک سری کد در حافظه خارجی (External Storage) کپی کرده و سپس آن را اجرا می کنند تا صفحه نصب به کاربر نمایش داده شود. بنابراین در حالت عادی، حتما کاربر باید فایل apk را به صورت دستی نصب کند (اجازه وی، ضروری می باشد).
اگر گوشی root شده باشد، امکان دارد که با یک سری کد، فایل apk بدون اجازه کاربر نصب شود (اما برای گوشی های root نشده عمل نمی کند) (اینگونه کدها را می توانید با جستجو در اینترنت بیابید).
لطفا سوالات خود را در مباحث مرتبط مطرح کنید. همچنین سوالات طولانی و یا سوالاتی که ربطی به مباحث ندارند را در انجمن سایت مطرح نمایید.
سلام
این حلقه که تو برنامه هست ازش بیرون نمیاد گیر می کنه ؟
درسش کنید به ماهم بگید
اگر چندین فایل متنی داشته باشیم برای انتقال از raw به sd و ساخت کلید جستجو برای ان باید کد بالا رو چطور تغییر داد؟
سلام
میخوام وقتی بر روی باتنی کلیک کردم اهنگ در حافظه ذخیره شه ؟
با تشکر
سلام من همه کد ها رو نوشتم ولی وقتی خروجی میگیرم روی دکمه مربوط به اجرای این کد کلیک میکنم کلا برنامه متوقف میشه .
فکر کنم یک مشکلی هست تو کد ها چون وقتی کپی کردم همش ارور بود باید قسمت هایی که جاخالی داشت رو پاک میکردم و دوباره جاخالی میزدم تا خطا رفع بشه لطفا سورس این کد رو برای دانلود بزارین تا کسان دیگه که مثل من مشکل دارن بتونن استفاده کنن .
میخوام کد رو از روی سورس کپی کنم .
ممنون
باسلام
عذر خواهم چطور میشه برنامه ای نوشت که بشه از حافظه کاربر فایلی رو انتخاب کرد و فایل انتخاب شده رو تو حافظه خارجی کپی کرد؟
و اینکه چطور میشه آدرس واقعیه فایلی که انتخاب میشه رو بدست آورد؟
سلام تشکر به خاطر آموزش عالیتون من تونستم برنامه ام رو خودم درست کنم با کمک آموزش شما، دستتون درد نکنه
فقط یک نکته اینکه اندروید 10 کار نمیکنه!
من برنامه ای نوشته ام که یک فایل موسیقی رو با زدن یک دکمه در حافظه در پوشه ای کپی میکنه، در همه نسخه های اندروید کپی میشه بدونه مشکل الا اندروبد 10، پیشنهادتون چیه؟