Copying from asset folder to SD card
Solution 1
I hope below code may helps you -
package com.paresh.copyfileassetstoAssets;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
public class CopyFileAssetsToSDCardActivity extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
CopyAssets();
}
private void CopyAssets() {
AssetManager assetManager = getAssets();
String[] files = null;
try {
files = assetManager.list("Files");
} catch (IOException e) {
Log.e("tag", e.getMessage());
}
for(String filename : files) {
System.out.println("File name => "+filename);
InputStream in = null;
OutputStream out = null;
try {
in = assetManager.open("Files/"+filename); // if files resides inside the "Files" directory itself
out = new FileOutputStream(Environment.getExternalStorageDirectory().toString() +"/" + filename);
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
} catch(Exception e) {
Log.e("tag", e.getMessage());
}
}
}
private void copyFile(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int read;
while((read = in.read(buffer)) != -1){
out.write(buffer, 0, read);
}
}
}
A best Blog for copy assets files to sdcard. And, also make sure the required permission for External Storage
Solution 2
After many searches, I simply wanted a method I could use in a thread later on, here is what I am using for my application:
static public void copyFileFromAssets(Context context, String file, String dest) throws Exception
{
InputStream in = null;
OutputStream fout = null;
int count = 0;
try
{
in = context.getAssets().open(file);
fout = new FileOutputStream(new File(dest));
byte data[] = new byte[1024];
while ((count = in.read(data, 0, 1024)) != -1)
{
fout.write(data, 0, count);
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if (in != null)
{
try {
in.close();
} catch (IOException e)
{
}
}
if (fout != null)
{
try {
fout.close();
} catch (IOException e) {
}
}
}
}
Please let me know if this helps!
Solution 3
Please try to increase the size of the SD card in AVD manager whatever you use. I hope it help you.
Sanjay Herle
Updated on June 04, 2022Comments
-
Sanjay Herle about 2 years
I am not sure what is wrong with this code? It creates a file in SD card but with 0 byte.. Can one of you look into it and tell me whats wrong with this?
Here i am trying to copy a file from asset folder which is codes.db to sd card..
AssetManager assetManager = getResources().getAssets(); InputStream in = null; OutputStream out = null; BufferedInputStream buf = null; try { in = assetManager.open("codes.db"); } catch (IOException e) { // TODO Auto-generated catch block System.out.println("Error jh: " + e.getMessage()); } if (in != null) { try { out = new FileOutputStream("/sdcard/" + "codes.db"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block System.out.println("Error Line : " + e.getLocalizedMessage()); } } System.out.println("IN VALUE : " + in); System.out.println("OUT VALUE : " + out); int chunkBytes = 0; byte[] outputByte = new byte[1024]; if (in != null && out != null) { try { // while ((chunkBytes = in.read(outputByte, 0, 1024)) != -1) { while ((chunkBytes = in.read()) != -1) { // write contents to the file System.out.println("I m here"); // out.write(outputByte, 0, (int) chunkBytes); out.write(chunkBytes); // publish the progress of downloading.. } } catch (Exception e) { // TODO Auto-generated catch block System.out.println("Error here: " + e.getLocalizedMessage().toString()); } } try { in.close(); out.close(); } catch (IOException e) { // TODO Auto-generated catch block System.out.println("Error there: " + e.getLocalizedMessage()); } }
I am getting this error in all the case.. i am sure i have my permission set... codes.db in sd card is 0 byte... :(
05-24 09:59:34.221: W/System.err(5559): java.io.IOException 05-24 09:59:34.221: W/System.err(5559): at android.content.res.AssetManager.readAsset(Native Method) 05-24 09:59:34.221: W/System.err(5559): at android.content.res.AssetManager.access$700(AssetManager.java:36) 05-24 09:59:34.221: W/System.err(5559): at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:571) 05-24 09:59:34.221: W/System.err(5559): at com.bewo.copy.TestCopyActivity.copyStream(TestCopyActivity.java:136) 05-24 09:59:34.221: W/System.err(5559): at com.bewo.copy.TestCopyActivity.onCreate(TestCopyActivity.java:19) 05-24 09:59:34.221: W/System.err(5559): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 05-24 09:59:34.221: W/System.err(5559): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2635) 05-24 09:59:34.221: W/System.err(5559): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2687) 05-24 09:59:34.221: W/System.err(5559): at android.app.ActivityThread.access$2300(ActivityThread.java:127) 05-24 09:59:34.221: W/System.err(5559): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2035) 05-24 09:59:34.221: W/System.err(5559): at android.os.Handler.dispatchMessage(Handler.java:99) 05-24 09:59:34.221: W/System.err(5559): at android.os.Looper.loop(Looper.java:123) 05-24 09:59:34.221: W/System.err(5559): at android.app.ActivityThread.main(ActivityThread.java:4635) 05-24 09:59:34.221: W/System.err(5559): at java.lang.reflect.Method.invokeNative(Native Method) 05-24 09:59:34.221: W/System.err(5559): at java.lang.reflect.Method.invoke(Method.java:521) 05-24 09:59:34.221: W/System.err(5559): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 05-24 09:59:34.221: W/System.err(5559): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 05-24 09:59:34.221: W/System.err(5559): at dalvik.system.NativeStart.main(Native