2017-01-02 7 views
1

基本的に、私のコードでは「MotiMate」と呼ばれるギャラリーにフォルダを作成し、特定の画像ビューからそのフォルダに取り込んだ画像を保存する必要があります。また、私はAPI 23をターゲットにしているので、ストレージ権限付与メソッドを処理する必要があります。それを行う方法は?imageviewから特定のギャラリーフォルダAPIに画像を保存する23

コード:

public void downloadImageToGallery() { 
    File filepath = Environment.getExternalStorageDirectory(); 
    File dir = new File(filepath.getAbsolutePath() + "/MotiMate/"); 
    dir.mkdirs(); 

    ImageView iv = (ImageView) findViewById(R.id.imageView); 
    iv.setDrawingCacheEnabled(true); 
    bitmap = iv.getDrawingCache(); 
    String title = quoteType+n+".jpg"; 
    file = new File(dir, title); 
    if(file.exists()) { 
     file.delete(); 
    } 
    try { 
     FileOutputStream out = new FileOutputStream(file); 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); 
     out.flush(); 
     out.close(); 
     isStoragePermissionGranted(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    Toast.makeText(this, "Downloading...", Toast.LENGTH_SHORT).show(); 
} 
public boolean isStoragePermissionGranted() { 
    if (Build.VERSION.SDK_INT >= 23) { 
     if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) 
       == PackageManager.PERMISSION_GRANTED) { 
      Log.v("", "Permission is granted"); 
      addImageToGallery(file.getAbsolutePath(), Quote.this); 
      return true; 
     } else { 

      Log.v("","Permission is revoked"); 
      ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
      return false; 
     } 
    } 
    else { //permission is automatically granted on sdk<23 upon installation 
     Log.v("","Permission is granted"); 
     addImageToGallery(file.getAbsolutePath(), Quote.this); 
     return true; 
    } 
} 
@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if(grantResults[0]== PackageManager.PERMISSION_GRANTED) { 
     Log.v("","Permission: "+permissions[0]+ "was "+grantResults[0]); 
     //resume tasks needing this permission 
    } 
} 
public static void addImageToGallery(final String filePath, final Context context) { 
    ContentValues values = new ContentValues(); 

    values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis()); 
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); 
    values.put(MediaStore.MediaColumns.DATA, filePath); 

    context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
} 

答えて

0
File wallpaperDirectory = new File(Environment.getExternalStorageDirectory() + "/MESSAGES/"); 
    if (!wallpaperDirectory.exists()) { 
     if (!wallpaperDirectory.mkdirs()) { 
      // have the object build the directory structure, if needed. 
      wallpaperDirectory.mkdirs(); 
     } 
    } 
    Random generator = new Random(); 
    int n = 10000; 
    n = generator.nextInt(n); 
    String fname = "Image-" + n + ".jpg"; 
    File file = new File(wallpaperDirectory, fname); 
    if (file.exists()) file.delete(); 
    try { 
     FileOutputStream out = new FileOutputStream(file); 
     finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); 
     out.flush(); 
     out.close(); 

     MediaScannerConnection.scanFile(context, new String[]{file.toString()}, null, 
       new MediaScannerConnection.OnScanCompletedListener() { 
        public void onScanCompleted(String path, Uri uri) { 
        } 
       } 
     ); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

使用は、このコードでは、それは...私のために働くとも許可あなたのマニフェスト・ファイル内の

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

を与えます。

あなたの活動のマニュアルparmission

if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE) != 
      PackageManager.PERMISSION_GRANTED) { 
     final String[] permission = new String[]{ 
       android.Manifest.permission.WRITE_EXTERNAL_STORAGE, 
       android.Manifest.permission.READ_EXTERNAL_STORAGE, 
       android.Manifest.permission.INTERNET, 
       android.Manifest.permission.READ_PHONE_STATE, 
       android.Manifest.permission.GET_ACCOUNTS, 
       android.Manifest.permission.WAKE_LOCK, 
       android.Manifest.permission.RECEIVE_SMS, 
       android.Manifest.permission.PACKAGE_USAGE_STATS, 
       android.Manifest.permission.GET_TASKS, 
       android.Manifest.permission.CAMERA, 
       android.Manifest.permission.VIBRATE, 
       android.Manifest.permission.ACCESS_WIFI_STATE, 
       android.Manifest.permission.ACCESS_NETWORK_STATE, 
     }; 
     ActivityCompat.requestPermissions(this, permission, 0); 
    } 
+0

しかし、私は手動で許可を処理するために必要があるでしょうか? –

+0

は編集された答えを示します。 –

0
1. need write permission in mainfest 
     // retrieving bitmap from imageview 

2.   Bitmap b = newImageView.getDrawingCache(); 

3.  // writing image into MotiMave folder 
     public void saveFile(Bitmap b){ 
      try { 

     File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/MotiMate/"); 

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

         File imageFile = File.createTempFile(
           String.valueOf(Calendar.getInstance().getTimeInMillis()), 
           ".jpeg",      /* suffix */ 
           storageDir     /* directory */ 
         ); 


      FileOutputStream writeStream = new FileOutputStream(imageFile); 
         Timber.d(">> writing images"); 
         b.compress(Bitmap.CompressFormat.JPEG, 100, writeStream); 
         writeStream.flush(); 
         writeStream.close(); 

         addPicToGallery(imageFile); 
         Toast.makeText(this, R.string.image_save_msg, Toast.LENGTH_SHORT).show(); 
        } catch (Exception e) { 
         e.printStackTrace(); 

         Toast.makeText(this, R.string.image_save_error_msg, Toast.LENGTH_SHORT).show(); 
        } 
       } 

4. // scanning image in gallery 
      public void addPicToGallery(File imageFile) 
      { 
      Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 

        Uri contentUri = Uri.fromFile(imageFile); 
        mediaScanIntent.setData(contentUri); 
        sendBroadcast(mediaScanIntent); 
      } 
+0

それは動作しません:( –

関連する問題