2017-07-16 69 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. 
     } 
    }