2017-07-16 67 views
-2

我想從drawable保存圖片。該應用程序的工作原理,但只適用於API 22以下的Android版本。在較新的版本中,圖像不會保存在圖庫中。該代碼僅適用於某些android版本

我的代碼:

public class MainActivity extends AppCompatActivity { 

    Bitmap anImage; 

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

     Drawable myDrawable = getResources().getDrawable(R.drawable.tapeta1, null); 
     anImage = ((BitmapDrawable) myDrawable).getBitmap(); 
    } 

    public void addImageToGallery(View view) { 
     int e = view.getId(); 

     switch (e) { 
      case R.id.button: 
       saveImageToExternalStorage(anImage); 
       Toast.makeText(getApplicationContext(), "Saved successfully, Check gallery", Toast.LENGTH_SHORT).show(); 
       break; 
     } 
    } 

    private void saveImageToExternalStorage(Bitmap finalBitmap) { 
     String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString(); 
     File myDir = new File(root + "/saved_images_1"); 
     myDir.mkdirs(); 
     Random generator = new Random(); 
     int n = 10000; 
     n = generator.nextInt(n); 
     String fname = "Image-" + n + ".jpg"; 
     File file = new File(myDir, fname); 
     if (file.exists()) 
      file.delete(); 
     try { 
      FileOutputStream out = new FileOutputStream(file); 
      finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); 
      out.flush(); 
      out.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

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

    } 

} 
+0

非常抱歉應該是「API 23以下」 –

回答

0

在您通過傳遞寫入外部存儲權限來創建方法調用請求權限之前,還可以對其他方法進行anthing。這將顯示用戶授予權限。如果允許您繼續保存文件,則可以在活動中覆蓋onpermissionsresult以查看權限結果。如果你不想要所有這些,然後保存在內部存儲。 getfilesdir方法將爲您提供應用程序內部目錄的路徑,並且不需要運行時權限。

0

您需要從應用程序請求RunTime permission

if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.WRITE_EXTERNAL_STORAGE) 
      != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 

      // Show an explanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 

     } else { 

      // No explanation needed, we can request the permission. 

      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
        MY_PERMISSIONS_REQUEST_READ_CONTACTS); 

      // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
      // app-defined int constant. The callback method gets the 
      // result of the request. 
     } 
    }