2017-04-12 106 views
0

我需要將一些文件保存到我的Android手機中。 所以我用類似:Android如何保存文件?

FileOutputStream os = null; 
try{ 
    os = new FileOutputStream("/root/sdcard/DCIM/1.jpg"); 
    os.write(bytes); 
    os.close(); 
}catch(FileNotFoundException e){} 

當我做到這一點,它會說,像

java.io.FileNotFoundException: /root/sdcard/DCIM/1.jpg (Permission denied) 

順便說一句,我使用類似已經requestd權限在AndroidManifest.xml:

<user-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
我也試過

,它實際上是指

/data/user/0/come.package.xxx/files 

這我不知道這條道路是因爲我無法找到我的手機上。 當我使用ASUS文件管理器時,我看到路徑是/ root/sdcard/...,但我的手機中甚至沒有SD卡,我已經使用iPhone多年了,所以我沒有了解Android文件系統現在如何工作。

這真的讓我感到困惑,有人可以向我解釋一下Android文件系統的工作原理嗎?謝謝你們!

+0

,如果您使用的是Android 6.0或以上,那麼你應該手動批准許可或應該要求它的運行時間之後。 – Anmol

+0

這裏是你需要[https://developer.android.com/training/permissions/requesting.html](https://developer.android.com/training/permissions/requesting.html) –

回答

0

如果你正在使用的Android 6.0沼澤或更高版本的Android版本u需要給運行時允許訪問。請嘗試下面的代碼

if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
      camera.setEnabled(false); 
      ActivityCompat.requestPermissions(getActivity(), new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0); 
     } 
@Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     if (requestCode == 0) { 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED 
        && grantResults[1] == PackageManager.PERMISSION_GRANTED) { 
       //permission will get success here 
       //do what you want 
      } 
      else { 
       //Permission not granted 
       Toast.makeText(getActivity(),"You need to grant camera permission to use camera",Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 
+0

我應該在哪裏放置你的碼?我可以在onCreate()中使用它嗎?我用相機的CameraSource insread,所以我不能使用setEnabled(); – x1uan

0

要保存圖像上的Android:

private String saveToInternalStorage(String name, Bitmap bitmapImage){ 
     ContextWrapper cw = new ContextWrapper(context); 
     // path to /data/data/yourapp/app_data/imageDir 
     File directory = cw.getDir(IMAGE_TAG, Context.MODE_PRIVATE); 
     // Create imageDir 
     File mypath = new File(directory, name + ".jpg"); 

     FileOutputStream fos = null; 

     try { 
      fos = new FileOutputStream(mypath); 
      // Use the compress method on the BitMap object to write image to the OutputStream 
      bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (fos != null) { 
        fos.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     return directory.getAbsolutePath(); 
    } 

要加載圖像:

public void loadImage(ImageView imageView) { 
     // get path 
     ContextWrapper cw = new ContextWrapper(context); 
     File directory = cw.getDir(IMAGE_TAG, Context.MODE_PRIVATE); 
     String path = directory.getAbsolutePath(); 

     // load image 
     try { 
      File f = new File(path, name + ".jpg"); 
      Bitmap b = BitmapFactory.decodeStream(new FileInputStream(f)); 
      imageView.setImageBitmap(b); 
      imageView.setVisibility(View.VISIBLE); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
      Log.d("Image", "Image file not found.");  
     } 
} 
0

如果你是你唱棉花糖或Android的最新版本,所以你需要在運行時提供權限,在你的按鈕點擊比你需要調用你的代碼保存文件到SD卡。

不是做這樣的,

public void onClick(View v) { 
    // write on SD card file data in the text box 
    try { 
     File myFile = new File("/sdcard/mysdfile.txt"); 
     myFile.createNewFile(); 
     FileOutputStream fOut = new FileOutputStream(myFile); 
     OutputStreamWriter myOutWriter = 
           new OutputStreamWriter(fOut); 
     myOutWriter.append(txtData.getText()); 
     myOutWriter.close(); 
     fOut.close(); 
     Toast.makeText(getBaseContext(), 
       "Done writing SD 'mysdfile.txt'", 
       Toast.LENGTH_SHORT).show(); 
    } catch (Exception e) { 
     Toast.makeText(getBaseContext(), e.getMessage(), 
       Toast.LENGTH_SHORT).show(); 
    } 
} 
+0

謝謝!但它看起來像你的代碼讀取文件系統中的文本。 – x1uan

+0

對不起,現在檢查。 –