2013-02-20 114 views
0

我們有一個休息API,我可以獲取我需要下載並保存到我創建的文件夾中的設備的文件列表。所以我可以保存一個文件,不知道這是如何工作的。將文件從API保存到內部文件夾

這些文件是從WCF api下載的。輸出流內容類型是來自wcf服務的OCTET_STREAM。

首先,我獲得/創建目錄,並創建文件:

File mediadir = context.getDir("foo", Context.MODE_PRIVATE); 
File file = new File(mediadir, "newfile.png"); // the file name I get from the server, it could be any thing 
FileOutputStream out = new FileOutputStream(file); // Stream the contents of the file on the server to the localfile? 

我試着去下載這樣的文件:

File mediadir = context.getDir("tvr", Context.MODE_PRIVATE); 

    URL url = new URL(urlString); 
    URLConnection conexion = url.openConnection(); 
    conexion.connect(); 
    int lenghtOfFile = conexion.getContentLength(); 
    InputStream is = url.openStream(); 
    FileOutputStream fos = new FileOutputStream(mediadir+"/video.mp4"); 
    byte data[] = new byte[1024]; 
    int count = 0; 
    long total = 0; 
    int progress = 0; 
    while ((count=is.read(data)) != -1){ 
     total += count; 
     int progress_temp = (int)total*100/lenghtOfFile; 
     if(progress_temp%10 == 0 && progress != progress_temp){ 
      progress = progress_temp; 
     } 
     fos.write(data, 0, count); 
    } 
    is.close(); 
    fos.close(); 

一旦它到達.connect()我得到錯誤java.net.SocketException:套接字失敗:EACCES(權限被拒絕)

我的清單看起來像這樣:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.tvrplayer" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 
    <permission android:name="android.permission.INTERNET"></permission> 
    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.tvrplayer.MainActivity" 
      android:label="@string/app_name" 
      android:theme="@android:style/Theme.NoTitleBar.Fullscreen" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 


</manifest> 

如何將api文件保存到我創建的本地導演?

我也寫了一個web應用程序,這樣做到用戶瀏覽器,但我不知道它如何在android上工作。

UPDATE

所以之後我chandged行至權限錯誤走了,現在我有一個新的錯誤:

02-20 09:51:28.909: E/AndroidRuntime(12594): FATAL EXCEPTION: main 
02-20 09:51:28.909: E/AndroidRuntime(12594): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tvrplayer/com.example.tvrplayer.MainActivity}: android.os.NetworkOnMainThreadException 
02-20 09:51:28.909: E/AndroidRuntime(12594): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at android.app.ActivityThread.access$600(ActivityThread.java:128) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at android.os.Looper.loop(Looper.java:137) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at android.app.ActivityThread.main(ActivityThread.java:4514) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at java.lang.reflect.Method.invokeNative(Native Method) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at java.lang.reflect.Method.invoke(Method.java:511) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at dalvik.system.NativeStart.main(Native Method) 
02-20 09:51:28.909: E/AndroidRuntime(12594): Caused by: android.os.NetworkOnMainThreadException 
02-20 09:51:28.909: E/AndroidRuntime(12594): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at libcore.io.IoBridge.connect(IoBridge.java:112) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at java.net.Socket.connect(Socket.java:842) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:77) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at com.example.tvrplayer.MainActivity.download(MainActivity.java:127) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at com.example.tvrplayer.MainActivity.downLoadMedia(MainActivity.java:118) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at com.example.tvrplayer.MainActivity.onCreate(MainActivity.java:52) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at android.app.Activity.performCreate(Activity.java:4465) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053) 
02-20 09:51:28.909: E/AndroidRuntime(12594): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934) 
02-20 09:51:28.909: E/AndroidRuntime(12594): ... 11 more 
+0

添加到寫入外部存儲在您的清單權限它會工作 – k0sh 2013-02-20 07:51:23

回答

1
File path = new File(getActivity().getFilesDir(), "Your Folder Name"); 
// if the directory doesn't exist it will create one. 
path.mkdirs(); 
File file = new File(path,"Your File Name"); 
//if the file doesn't exist it will create one 
file.createNewFile(); 

//for write 
FileOutputStream fout = new FileOutputStream(file); 
ObjectOutputStream os = new ObjectOutputStream(fout); 
os.writeObject("Your Object"); 
os.flush(); 
os.close(); 

//for read 
FileInputStream fis = new FileInputStream(file); 
ObjectInputStream is = new ObjectInputStream(fis); 
Your_Object_Type variable = (Your_Object_Type) is.readObject(); 
is.close(); 

在我的情況我已經寫了一類對象

編輯:

這是發生的,因爲你已經在主UI-Thread上使用了互聯網請求。修改代碼:

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     try { 
      //............ 
      // your internet code 
      //............. 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      Log.e(Tag, e.toString()); 
     } 
    } 
    }).start(); 

編輯2: 如果u想知道該文件被保存與否,檢查:

File file = new File(mediadir, "newfile.png"); 
if(file.exists()){ 
    //that means the "newfile.png" is exist in otherword it is saved 
}else{ 
     //that means the "newfile.png" does not exist in otherword it is not saved 
} 
+0

謝謝,不知道如何從API獲取數據。我正在看這個例子,並通過它:http://stackoverflow.com/questions/5027624/android-download-all-files-from-a-folder-on-server。但我得到這樣的錯誤:http ://stackoverflow.com/questions/11273197/socket-failed-eacces-permission-denied – Harry 2013-02-20 07:27:26

+0

你有沒有在清單中定義'internet'權限? 如果你在模擬器上測試,那麼你可以關閉防火牆。防火牆可能會導致問題 – Shoshi 2013-02-20 07:37:58

+0

我已經這樣做了,即時測試在設備上。生病添加我的清單 – Harry 2013-02-20 07:39:45