2017-03-12 18 views
0

私のドロウアブルフォルダに画像があります。アクティビティでそれらが開き、必要な画像を選択してボタンをクリックします。それらはImageSavingTaskクラスインスタンス実行AsyncTaskを介して私のSDカードに保存する必要があります。その後、選択した画像がdoInBackground方法で処理されAndroid - AsyncTaskでSDカードに画像を保存できない

@Override 
public void onClick(View v) { 
    for (int i = 0; i < 26; i++) 
     if (checkBoxes[i].isChecked()) { 
      imageIndex = new ImageIndex(); //ImageIndex-a class with single index field which reserves the checked checkbox indexes. 
      imageIndex.index = i; 
      Bitmap bitmap = ((BitmapDrawable) (images[i].getDrawable())).getBitmap(); 
      SaveImageTask saveImageTask = new SaveImageTask(); 
      saveImageTask.execute(bitmap); //The class SaveImageTask extends AsyncTask<Bitmap, Void, Void> 
     } 
} 

Here's what my MainActivity looks like.

は、ここに私のonClickコードです。

@Override 
    protected Void doInBackground(Bitmap... params) { 
     FileOutputStream outStream = null; 
     try { 
      Bitmap bitmap = params[0]; 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
      byte[] imageBytes = stream.toByteArray(); 

      File sdCard = Environment.getExternalStorageDirectory(); 
      Drawable drawable = new BitmapDrawable(getResources(), bitmap); 
      File dir = new File(sdCard.getAbsolutePath()); 
      dir.mkdirs(); 

      String fileName = "Saved image " + imageIndex.index; //The reserved index of checkbox creates a name for the new file. 
      File outFile = new File(dir, fileName); 

      outStream = new FileOutputStream(outFile); 
      outStream.write(imageBytes); 
      outStream.flush(); 
      outStream.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />行が私のマニフェストに追加されました。

USBを電話機に接続しても、エラーは発生しませんが、SDカードに画像が保存されません。そして私は窓の検索を使用して私の携帯電話で画像を見つけることができません。デバッグは何の答えも出さない。これはどんな種類の問題でしょうか?

No errors on debug

+0

SaveImageTask saveImageTask = new SaveImageTask(); 'タスクに直接インデックスを付ける必要があります。すべてのタスクが同じになるので、今のようにグローバルではありません。より良い: 'SaveImageTask saveImageTask =新しいSaveImageTask(i);'。 – greenapps

+0

'Environment.getExternalStorageDirectory();'。 SDカードに保存するのではなく、外部ストレージに保存します。 – greenapps

+0

デバイスにファイルエクスプローラを使用して、画像が存在するかどうかを確認する必要があります。実際には、新しいファイルについてMediaStoreに通知していないので、PCでそれらを見ることはできません。実際にファイルが作成された場合は、デバイスの電源を入れ直した後にPC上に表示されます。 – greenapps

答えて

0

インデックスとビットマップの2つのArrayListsに選択したインデックスを追加します。 doInBackgroundメソッドでループを作成しました。

すぐにカードに画像を表示するために、私はMediaScannerConnection.scanFileメソッドを使用しました。

for (int i = 0; i < 26; i++) 
    if (checkBoxes[i].isChecked()) { 
     index.add(i); 
     bitmap.add(bitmaps[i]); 
    } 
if (bitmap.size() > 0) 
    new SaveImageTask().execute(); 

doInBackground方法:

protected Void doInBackground(Void... params) { 
      for (int i = 0; i < bitmap.size(); i++) { 
       try { 
        fname = "Saved image " + (index.get(i)) + ".jpg"; 
        file = new File(myDir, fname); 
        if (file.exists()) file.delete(); 
        FileOutputStream out = new FileOutputStream(file); 
        bitmap.get(i).compress(Bitmap.CompressFormat.JPEG, 100, out); 
        out.flush(); 
        out.close(); 
        MediaScannerConnection. 
          scanFile(getApplicationContext(), new String[]{file.getPath()}, new String[]{"image/jpeg"}, null); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      return null; 
     } 

私がフィールドとパラメータなしImageSavingTaskを残しました。

0

あなたのSDカードにファイルを書き込むためのランタイム許可を求めていないようです。 Android M以上では、実行時に外部のSDカードにファイルを保存するための書き込み権限を依頼する必要があります。

チェックhttps://developer.android.com/training/permissions/requesting.html

はまた、あなたがGoogleのライブラリを使用することができますpermissions-ランタイムを要求する方法については、このリンク - https://github.com/googlesamples/easypermissions 要求の許可にします。

+0

5.0バージョンのAPIがあります。 –

+0

マニフェストに書き込み権限を追加しましたか? – Passiondroid

+0

はい、書き込み権限と読み取り権限の両方です。 <使用許可android:name =" android.permission.READ_EXTERNAL_STORAGE "/> <アプリケーション... –

0

私はバイトを書くことを試みる問題を考える。ソリューションに続き

使用..

@Override 
protected Void doInBackground(Bitmap... params) { 
     Bitmap bitmap = params[0]; 
     saveToInternalStorage(bitmap, "MyImage"); // pass bitmap and ImageName 
     return null; 
} 

//Method to save Image in InternalStorage 
private void saveToInternalStorage(Bitmap bitmapImage, String imageName) { 

      File mypath = new File(Environment.getExternalStorageDirectory(), imageName + ".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.JPEG, 100, fos); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       try { 
        fos.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

注:あなたはストレージの読み取り/書き込み権限を追加したとマシュマロと上位バージョンに許可を求めることを忘れないようにしてください。

関連する問題