2016-08-10 4 views
1

그림을 외부 저장소에 저장하려고했으나이 파일은 존재하지 않습니다. rescanned SD, changed getExternalStorageDirectory (이 예제에서는 간단한 drawable resourse를 사용합니다)그림 파일이 SD로 저장되지 않습니다

<uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

코드가있다 : getExternalStoragePublicDirectory 에 그냥 작동하지 않습니다

...

) 나는 모든 권한이

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Environment; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new DrawView(this)); 
    } 

    class DrawView extends View { 

     Paint paint; 
     Bitmap bitmap; 

     public DrawView(Context context) { 
      super(context); 
      paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
      paint.setTextSize(40); 

      Bitmap bmpIcon = BitmapFactory.decodeResource(getResources(), R.drawable.launcher); 
      bmpIcon = Bitmap.createScaledBitmap(bmpIcon, 500, 500, true); 

      bitmap = Bitmap.createBitmap(500, 500, Bitmap.Config.RGB_565); 
      Canvas canvas = new Canvas(bitmap); 
      canvas.drawColor(Color.WHITE); 
      canvas.drawBitmap(bmpIcon, 0,0, paint); 
      canvas.drawText("Saved bitmap", 100, 50, paint); 

      File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "savedBitmap.png"); 
      try { 
       file.createNewFile(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      try { 
       FileOutputStream fos = null; 
       try { 
        fos = new FileOutputStream(file); 
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
       } finally { 
        if (fos != null) fos.close(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } 

     @Override 
     protected void onDraw(Canvas canvas) { 
      canvas.drawARGB(80, 102, 204, 255); 
      canvas.drawBitmap(bitmap, 100, 100, paint); 
     } 

    } 
} 
+0

"권한이 있습니다"- READ_INTERNAL_STORAGE 권한이없고 WRITE_INTERNAL_STORAGE 권한이 없습니다. MediaStore를 업데이트하는 코드가 없습니다 (예 :'MediaScannerConnection.scanFile()'). 그 외에도 LogCat에서 스택 추적을 얻고 있습니까? "이 파일이 존재하지 않는다"고 어떻게 결정합니까? – CommonsWare

+0

이것은 자습서이며 단계별로 시도했습니다. READ_INTERNAL_STORAGE 및 WRITE_INTERNAL_STORAGE는 위의 예에 있습니다. 팁 MediaScannerConnection.scanFile() – Alisa

+0

"READ_INTERNAL_STORAGE 및 WRITE_INTERNAL_STORAGE가 위의 예에 존재합니다"에 대한 답변을 주신 데, - [해당 권한이 Android에 존재하지 않으므로] 더 나은 예제를 사용하십시오 (https://developer.android.com/). reference/android/Manifest.permission.html). – CommonsWare

답변

0

파일은 내장 스토리지에 어떻게 든 14 API를 태블릿에 저장하고 당신은 가장 가능성, runtime permissions을 구현하지 않는 23 API를

에 전화를하지 않습니다.

LogCat을 보면 스택 트레이스에서 외부 저장소로 작업 할 수있는 권한이 없음을 알 수 있습니다.

+0

당신이 맞습니다. 이것이 진정한 이유였습니다! targed sdk 22 파일로 다운 그레이드했을 때 targetSdkVersion 23 파일에 런타임 권한 (http://stackoverflow.com/a/34722591/6570875)을 구현하면 성공적으로 내부 전화 저장소에 저장되었습니다. 이유를 모르겠습니다. . 도움 주셔서 대단히 감사합니다! – Alisa

관련 문제