2016-09-30 34 views
0

私は提供された画像にユーザーが書き込みを許可し、ギャラリーに保存することができる非常にシンプルなアプリを作ろうとしています。 私は以下のコードを試してみましたが、保存することはできません。 編集する必要がある部分を教えてください。imageView画像をギャラリーに保存しようとしましたが、ギャラリーに保存できません。(Android)

ImageView imagecp = (ImageView) findViewById(R.id.imageView1); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 




} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.actionbar, menu); 


    return super.onCreateOptionsMenu(menu); 
} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 


    switch(item.getItemId()){ 
     case R.id.savebutton: 
      Bitmap bitmap = ((BitmapDrawable)imagecp.getDrawable()).getBitmap(); 
      Save savefile = new Save(); 
      savefile.SaveImage(this, bitmap); 

      Toast.makeText(getApplicationContext(),"image saved", Toast.LENGTH_SHORT).show(); 

     default: 
      return super.onOptionsItemSelected(item); 


} 

public class Save { 
private Context TheThis; 
private String NameOfFolder = "/Amir_Paint"; 
private String NameOfFile = "APaintImage"; 

public void SaveImage(Context context,Bitmap ImageToSave){ 
    TheThis = context; 
    String file_path = Environment.getExternalStorageDirectory().getAbsolutePath()+ NameOfFolder; 
    String CurrentDateAndTime= getCurrentDateAndTime(); 
    File dir = new File(file_path); 

    if(!dir.exists()){ 
     dir.mkdirs(); 
    } 

    File file = new File(dir, NameOfFile +CurrentDateAndTime+ ".jpg"); 

    try { 
     FileOutputStream fOut = new FileOutputStream(file); 
     ImageToSave.compress(Bitmap.CompressFormat.JPEG, 85, fOut); 
     fOut.flush(); 
     fOut.close(); 
     MakeSureFileWasCreatedThenMakeAvabile(file); 
     AbleToSave(); 

    } 
    catch (FileNotFoundException e) {UnableToSave();} 
    catch (IOException e){UnableToSave();} 



} 



private void MakeSureFileWasCreatedThenMakeAvabile(File file) { 
    MediaScannerConnection.scanFile(TheThis, 
      new String[] { file.toString() }, null, 
      new MediaScannerConnection.OnScanCompletedListener() { 
     public void onScanCompleted(String path, Uri uri) { 
      Log.e("ExternalStorage", "Scanned " + path + ":"); 
      Log.e("ExternalStorage", "-> uri=" + uri); 

     } 
    }); 

} 



private String getCurrentDateAndTime() { 
    Calendar c = Calendar.getInstance(); 
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); 
    String formattedDate = df.format(c.getTime()); 
    return formattedDate; 
} 


private void UnableToSave() { 
Toast.makeText(TheThis, "Picture cannot saved to gallery", Toast.LENGTH_SHORT).show(); 

} 

private void AbleToSave() { 
Toast.makeText(TheThis, "Picture saved successfully", Toast.LENGTH_SHORT).show(); 

} 

}

、エラーメッセージ以下。

09-30 14:30:30.311 3847-3863 W/EGL_emulation﹕ eglSurfaceAttrib not implemented 
09-30 14:30:30.311 3847-3863/ W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xad761380, error=EGL_SUCCESS 
09-30 14:30:32.259 3847-3863/ E/Surface﹕ getSlotFromBufferLocked: unknown buffer: 0xab79e440 
09-30 14:30:38.354 3847-3847/ W/art﹕ Long monitor contention event with owner method=void android.os.MessageQueue.nativeWake(long) from MessageQueue.java:4294967294 waiters=0 for 618ms 
09-30 14:30:38.389 3847-4029/ W/art﹕ Long monitor contention event with owner method=void android.os.MessageQueue.nativeWake(long) from MessageQueue.java:4294967294 waiters=1 for 651ms 
09-30 14:30:38.461 3847-3863/ E/Surface﹕ getSlotFromBufferLocked: unknown buffer: 0xab79e360 
09-30 14:32:33.654 3847-3854/ W/art﹕ Suspending all threads took: 16.292ms 

これは私がmenifestファイルに書いた許可です。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
+1

エラーメッセージも共有する必要があります。 – ziLk

+0

'dir.mkdirs();'。それが失敗する可能性があるので、戻り値を確認してください。 falseの場合は、トーストと戻り値を表示します。 .exists()を再度使用して、ディレクトリが作成されているかどうかを確認することもできます。 – greenapps

+0

''絵はギャラリー ''に保存できません。それは本当ではありません。外部メモリのフォルダに保存できませんでした。ギャラリーアプリやMediaStoreとは関係ありません。さらに、どのフォルダーにファイルを書き込もうとしたかをユーザーに伝える必要があります。キャッチがある場合は、e.getMessage()を使用します。 – greenapps

答えて

0

onCreateViewメソッド内でビューインスタンスを設定する必要があります。

これは間違っています。

ImageView imagecp = (ImageView) findViewById(R.id.imageView1); 

これは権利である:

String file_path = Environment.getExternalStorageDirectory().toString() + NameOfFolder; 
+0

私はちょうどimagecp =(ImageView)findViewById(R.id.imageView1);このコードはonCreateメソッド内にあります。しかし、ImageViewイメージを維持してください。この部分は外部にあるので、コードの後半でimagecpを再利用することができます。そして、それは動作します。 – JessJ

+0

@JessJ thatsなぜ私はインスタンスを呼び出しました。 https://en.wikipedia.org/wiki/Instance_variable – ziLk

+0

アプリがクラッシュすることはありませんが、画像は保存できません(IOException)。私が間違っている他の部分はありますか?私は新しいエラーメッセージを追加しました。 – JessJ

0

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.testclassfragment, container, false); 
    imagecp = (ImageView)v.findViewById(R.id.imageView1); 
    return v 
}} 

変更この

String file_path = Environment.getExternalStorageDirectory().getAbsolutePath()+ NameOfFolder; 

代わりに、この古いコードのMediaStore insertImageを使用することを検討してください。

関連する問題