Android: Added an installer class that lets the user select default plugins to install and it will install the example.ini files.
Android: Added menu option to retry the MCServer install routine git-svn-id: http://mc-server.googlecode.com/svn/trunk@1050 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
parent
8ad7747902
commit
6aa243a953
@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.mcserver"
|
package="com.mcserver"
|
||||||
android:versionCode="1"
|
android:versionCode="2"
|
||||||
android:versionName="1.0" >
|
android:versionName="r1049" >
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||||
|
2
Android/assets/basedir/Plugins/README.txt
Normal file
2
Android/assets/basedir/Plugins/README.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Put all pre-packaged plugins in here such as Core.
|
||||||
|
The user will be able to install each plugin in here separately.
|
10
Android/assets/basedir/README.txt
Normal file
10
Android/assets/basedir/README.txt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
Put all pre-packaged settings/preferences and license files in here.
|
||||||
|
Such as:
|
||||||
|
|
||||||
|
settings.example.ini
|
||||||
|
groups.example.ini
|
||||||
|
users.example.ini
|
||||||
|
webadmin.example.ini
|
||||||
|
Lua-LICENSE.txt
|
||||||
|
MersenneTwister-LICENSE.txt
|
||||||
|
etc.etc
|
1
Android/assets/basedir/webadmin/README.txt
Normal file
1
Android/assets/basedir/webadmin/README.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
Put pre-packaged webadmin template in here
|
@ -16,6 +16,8 @@ import android.net.Uri;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
@ -31,13 +33,17 @@ public class MCServerActivity extends Activity {
|
|||||||
ArrayList<String> mLogList = new ArrayList<String>();
|
ArrayList<String> mLogList = new ArrayList<String>();
|
||||||
ArrayAdapter<String> mAdapter;
|
ArrayAdapter<String> mAdapter;
|
||||||
|
|
||||||
|
MCServerInstaller mInstaller = null;
|
||||||
|
|
||||||
|
final private int MENU_REINSTALL = 0;
|
||||||
|
|
||||||
/** Called when the activity is first created. */
|
/** Called when the activity is first created. */
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.main);
|
setContentView(R.layout.main);
|
||||||
|
|
||||||
Log.e("MCServer", "p id: " + android.os.Process.myPid() );
|
//Log.e("MCServer", "p id: " + android.os.Process.myPid() );
|
||||||
|
|
||||||
|
|
||||||
((Button)findViewById(R.id.start_server)).setOnClickListener( new View.OnClickListener() {
|
((Button)findViewById(R.id.start_server)).setOnClickListener( new View.OnClickListener() {
|
||||||
@ -135,12 +141,14 @@ public class MCServerActivity extends Activity {
|
|||||||
});
|
});
|
||||||
loggerThread.start();
|
loggerThread.start();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
((TextView)findViewById(R.id.ip_address)).setText("Connect to: " + getLocalIpAddress());
|
((TextView)findViewById(R.id.ip_address)).setText("Connect to: " + getLocalIpAddress());
|
||||||
|
|
||||||
|
|
||||||
|
mInstaller = new MCServerInstaller(this);
|
||||||
|
if( mInstaller.NeedsUpdate() )
|
||||||
|
{
|
||||||
|
mInstaller.ShowFirstRunDialog();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -234,9 +242,26 @@ public class MCServerActivity extends Activity {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void Testtt()
|
@Override
|
||||||
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
|
menu.add(0, MENU_REINSTALL, 0, "Reinstall MCServer" );
|
||||||
|
return super.onCreateOptionsMenu(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
|
||||||
|
switch( item.getItemId() )
|
||||||
{
|
{
|
||||||
//Log.d("MCServer", "in Testtt");
|
case MENU_REINSTALL:
|
||||||
|
mInstaller.ShowPluginInstallDialog(true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
432
Android/src/com/mcserver/MCServerInstaller.java
Normal file
432
Android/src/com/mcserver/MCServerInstaller.java
Normal file
@ -0,0 +1,432 @@
|
|||||||
|
package com.mcserver;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.app.ProgressDialog;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.pm.PackageManager.NameNotFoundException;
|
||||||
|
import android.content.res.AssetManager;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.os.Environment;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
public class MCServerInstaller {
|
||||||
|
private MCServerActivity mContext;
|
||||||
|
final private String BaseDirectory = "basedir";
|
||||||
|
final private String PluginDirectory = "Plugins";
|
||||||
|
|
||||||
|
final public String SHARED_PREFS_NAME = "MCSERVER_PREFS";
|
||||||
|
final public String PREF_IS_INSTALLED = "IS_INSTALLED";
|
||||||
|
final public String PREF_LAST_VERSION = "LAST_VERSION";
|
||||||
|
private SharedPreferences mSettings = null;
|
||||||
|
|
||||||
|
int thisVersion;
|
||||||
|
|
||||||
|
MCServerInstaller( MCServerActivity activity )
|
||||||
|
{
|
||||||
|
mContext = activity;
|
||||||
|
|
||||||
|
mSettings = mContext.getSharedPreferences( SHARED_PREFS_NAME, 0);
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.thisVersion = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionCode;
|
||||||
|
} catch (NameNotFoundException e) {
|
||||||
|
Log.e("MCServer", "Could not read version code from manifest!");
|
||||||
|
e.printStackTrace();
|
||||||
|
this.thisVersion = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean IsInstalled()
|
||||||
|
{
|
||||||
|
return mSettings.getBoolean(PREF_IS_INSTALLED, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean NeedsUpdate()
|
||||||
|
{
|
||||||
|
Log.i("MCServer", "thisVersion: " + this.thisVersion + " pref: " + mSettings.getInt(PREF_LAST_VERSION, 0));
|
||||||
|
return mSettings.getInt(PREF_LAST_VERSION, 0) != this.thisVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public ArrayList<String> FindFoldersInPath(String path)
|
||||||
|
{
|
||||||
|
ArrayList<String> allFolders = new ArrayList<String>();
|
||||||
|
AssetManager am = mContext.getAssets();
|
||||||
|
try {
|
||||||
|
String[] allPlugins = am.list(path);
|
||||||
|
for(String pluginName : allPlugins)
|
||||||
|
{
|
||||||
|
InputStream istr = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
istr = am.open(path + "/" + pluginName);
|
||||||
|
} catch( java.io.FileNotFoundException e ) {
|
||||||
|
// It seems to be a folder :D
|
||||||
|
allFolders.add(pluginName);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
istr.close();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return allFolders;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void ExpandAssets( String path )
|
||||||
|
{
|
||||||
|
AssetManager am = mContext.getAssets();
|
||||||
|
try {
|
||||||
|
String[] getAssets = am.list(path);
|
||||||
|
for(String assetName : getAssets)
|
||||||
|
{
|
||||||
|
//Log.e("MCServer", path + "/" + imgName);
|
||||||
|
|
||||||
|
InputStream istr = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
istr = am.open(path + "/" + assetName);
|
||||||
|
} catch( java.io.FileNotFoundException e ) {
|
||||||
|
//Log.e("MCServer", "Could not open" + path + "/" + imgName );
|
||||||
|
ExpandAssets(path + "/" + assetName);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String outPath = Environment.getExternalStorageDirectory().getPath() + "/mcserver/" + path + "/" + assetName;
|
||||||
|
//Log.e("MCServer", "outPath: " + outPath );
|
||||||
|
File f = new File( outPath );
|
||||||
|
|
||||||
|
f.getParentFile().mkdirs();
|
||||||
|
f.createNewFile();
|
||||||
|
OutputStream ostr = new FileOutputStream(f);
|
||||||
|
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
int length;
|
||||||
|
while ((length = istr.read(buffer))>0)
|
||||||
|
{
|
||||||
|
ostr.write(buffer, 0, length);
|
||||||
|
}
|
||||||
|
ostr.flush();
|
||||||
|
ostr.close();
|
||||||
|
istr.close();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ShowFirstRunDialog()
|
||||||
|
{
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
|
||||||
|
//builder.setTitle("blaa");
|
||||||
|
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
dialog.dismiss();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
builder.setMessage("It seems this is the first time you are running MCServer on your Android device or it has been updated! This app comes with a couple of pre-packaged plugins, please take a moment to select the plugins you would like to install.");
|
||||||
|
builder.setCancelable(false);
|
||||||
|
AlertDialog dialog = builder.create();
|
||||||
|
dialog.show();
|
||||||
|
|
||||||
|
dialog.setOnDismissListener( new DialogInterface.OnDismissListener(){
|
||||||
|
public void onDismiss(DialogInterface dialog) {
|
||||||
|
ShowPluginInstallDialog(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void ShowPluginInstallDialog(boolean bCancelable)
|
||||||
|
{
|
||||||
|
final ArrayList<String> allPlugins = FindFoldersInPath( BaseDirectory + "/" + PluginDirectory );
|
||||||
|
final CharSequence[] items = allPlugins.toArray(new CharSequence[allPlugins.size()]);
|
||||||
|
final boolean[] selected = new boolean[items.length];
|
||||||
|
for( int i = 0; i < items.length; ++i )
|
||||||
|
{
|
||||||
|
if( items[i].toString().contains("Core") )
|
||||||
|
{ // Select the core plugin by default
|
||||||
|
selected[i] = true;
|
||||||
|
items[i] = items[i] + " (Recommended)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
|
||||||
|
builder.setTitle("Plugins to install");
|
||||||
|
builder.setCancelable(bCancelable);
|
||||||
|
builder.setMultiChoiceItems(items, selected, new DialogInterface.OnMultiChoiceClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
|
||||||
|
selected[which] = isChecked;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
builder.setPositiveButton("Install", new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
ArrayList<String> toInstall = new ArrayList<String>();
|
||||||
|
for( int i = 0; i < selected.length; ++i )
|
||||||
|
{
|
||||||
|
if( selected[i] )
|
||||||
|
{
|
||||||
|
toInstall.add(allPlugins.get(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
InstallPlugins(toInstall);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
AlertDialog dialog2 = builder.create();
|
||||||
|
dialog2.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InstallPlugins( final ArrayList<String> plugins )
|
||||||
|
{
|
||||||
|
new AsyncTask<Void, Integer, Boolean>()
|
||||||
|
{
|
||||||
|
ProgressDialog progressDialog;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPreExecute()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* This is executed on UI thread before doInBackground(). It is
|
||||||
|
* the perfect place to show the progress dialog.
|
||||||
|
*/
|
||||||
|
progressDialog = ProgressDialog.show(mContext, "", "Installing...");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Boolean doInBackground(Void... params)
|
||||||
|
{
|
||||||
|
if (params == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* This is run on a background thread, so we can sleep here
|
||||||
|
* or do whatever we want without blocking UI thread. A more
|
||||||
|
* advanced use would download chunks of fixed size and call
|
||||||
|
* publishProgress();
|
||||||
|
*/
|
||||||
|
for( int i = 0; i < plugins.size(); ++i )
|
||||||
|
{
|
||||||
|
this.publishProgress((int)(i / (float)plugins.size() * 100), i);
|
||||||
|
InstallSinglePlugin(PluginDirectory + "/" + plugins.get(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
this.publishProgress( 100, -1 );
|
||||||
|
InstallExampleSettings();
|
||||||
|
|
||||||
|
this.publishProgress( 100, -2 );
|
||||||
|
InstallWebAdmin();
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log.e("tag", e.getMessage());
|
||||||
|
/*
|
||||||
|
* The task failed
|
||||||
|
*/
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The task succeeded
|
||||||
|
*/
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onProgressUpdate(Integer... progress)
|
||||||
|
{
|
||||||
|
progressDialog.setProgress(progress[0]);
|
||||||
|
if( progress[1] > -1 )
|
||||||
|
{
|
||||||
|
progressDialog.setMessage("Installing " + plugins.get(progress[1]) + "..." );
|
||||||
|
}
|
||||||
|
else if( progress[1] == -1 )
|
||||||
|
{
|
||||||
|
progressDialog.setMessage("Installing default settings...");
|
||||||
|
}
|
||||||
|
else if( progress[1] == -2 )
|
||||||
|
{
|
||||||
|
progressDialog.setMessage("Installing WebAdmin...");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Boolean result)
|
||||||
|
{
|
||||||
|
progressDialog.dismiss();
|
||||||
|
/*
|
||||||
|
* Update here your view objects with content from download. It
|
||||||
|
* is save to dismiss dialogs, update views, etc., since we are
|
||||||
|
* working on UI thread.
|
||||||
|
*/
|
||||||
|
AlertDialog.Builder b = new AlertDialog.Builder(mContext);
|
||||||
|
b.setTitle(android.R.string.dialog_alert_title);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
b.setMessage("Install succeeded");
|
||||||
|
|
||||||
|
SharedPreferences.Editor editor = mSettings.edit();
|
||||||
|
editor.putBoolean(PREF_IS_INSTALLED, true);
|
||||||
|
editor.putInt(PREF_LAST_VERSION, thisVersion);
|
||||||
|
editor.commit();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
b.setMessage("Install failed");
|
||||||
|
}
|
||||||
|
b.setPositiveButton(android.R.string.ok,
|
||||||
|
new DialogInterface.OnClickListener()
|
||||||
|
{
|
||||||
|
public void onClick(DialogInterface dialog, int which)
|
||||||
|
{
|
||||||
|
dialog.dismiss();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
b.create().show();
|
||||||
|
}
|
||||||
|
}.execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InstallExampleSettings()
|
||||||
|
{
|
||||||
|
AssetManager am = mContext.getAssets();
|
||||||
|
try {
|
||||||
|
String[] allFiles = am.list(BaseDirectory);
|
||||||
|
for(String fileName : allFiles)
|
||||||
|
{
|
||||||
|
InputStream istr = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
istr = am.open(BaseDirectory + "/" + fileName);
|
||||||
|
} catch( java.io.FileNotFoundException e ) {
|
||||||
|
// Must be a folder :D
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String outPath = Environment.getExternalStorageDirectory().getPath() + "/mcserver/" + fileName;
|
||||||
|
Log.i("MCServer", "outPath: " + outPath );
|
||||||
|
File f = new File( outPath );
|
||||||
|
|
||||||
|
f.getParentFile().mkdirs();
|
||||||
|
f.createNewFile();
|
||||||
|
OutputStream ostr = new FileOutputStream(f);
|
||||||
|
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
int length;
|
||||||
|
while ((length = istr.read(buffer))>0)
|
||||||
|
{
|
||||||
|
ostr.write(buffer, 0, length);
|
||||||
|
}
|
||||||
|
ostr.flush();
|
||||||
|
ostr.close();
|
||||||
|
istr.close();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InstallWebAdmin()
|
||||||
|
{
|
||||||
|
AssetManager am = mContext.getAssets();
|
||||||
|
try {
|
||||||
|
String[] allFiles = am.list(BaseDirectory + "/webadmin");
|
||||||
|
for(String fileName : allFiles)
|
||||||
|
{
|
||||||
|
InputStream istr = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
istr = am.open(BaseDirectory + "/webadmin/" + fileName);
|
||||||
|
} catch( java.io.FileNotFoundException e ) {
|
||||||
|
// Must be a folder :D
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String outPath = Environment.getExternalStorageDirectory().getPath() + "/mcserver/webadmin/" + fileName;
|
||||||
|
Log.i("MCServer", "outPath: " + outPath );
|
||||||
|
File f = new File( outPath );
|
||||||
|
|
||||||
|
f.getParentFile().mkdirs();
|
||||||
|
f.createNewFile();
|
||||||
|
OutputStream ostr = new FileOutputStream(f);
|
||||||
|
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
int length;
|
||||||
|
while ((length = istr.read(buffer))>0)
|
||||||
|
{
|
||||||
|
ostr.write(buffer, 0, length);
|
||||||
|
}
|
||||||
|
ostr.flush();
|
||||||
|
ostr.close();
|
||||||
|
istr.close();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InstallSinglePlugin( String path )
|
||||||
|
{
|
||||||
|
AssetManager am = mContext.getAssets();
|
||||||
|
try {
|
||||||
|
String[] getImages = am.list(BaseDirectory + "/" + path);
|
||||||
|
for(String imgName : getImages)
|
||||||
|
{
|
||||||
|
Log.i("MCServer", path + "/" + imgName);
|
||||||
|
|
||||||
|
InputStream istr = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
istr = am.open(BaseDirectory + "/" + path + "/" + imgName);
|
||||||
|
} catch( java.io.FileNotFoundException e ) {
|
||||||
|
Log.i("MCServer", "Could not open" + path + "/" + imgName );
|
||||||
|
InstallSinglePlugin(path + "/" + imgName);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String outPath = Environment.getExternalStorageDirectory().getPath() + "/mcserver/" + path + "/" + imgName;
|
||||||
|
Log.i("MCServer", "outPath: " + outPath );
|
||||||
|
File f = new File( outPath );
|
||||||
|
|
||||||
|
f.getParentFile().mkdirs();
|
||||||
|
f.createNewFile();
|
||||||
|
OutputStream ostr = new FileOutputStream(f);
|
||||||
|
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
int length;
|
||||||
|
while ((length = istr.read(buffer))>0)
|
||||||
|
{
|
||||||
|
ostr.write(buffer, 0, length);
|
||||||
|
}
|
||||||
|
ostr.flush();
|
||||||
|
ostr.close();
|
||||||
|
istr.close();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user