Как сохранить и показать растровое изображение в Android? - PullRequest
0 голосов
/ 26 июля 2011

Так что у меня есть небольшая проблема. Я не могу найти, как сохранить файл растрового изображения после расшифровки в SDCard или где-то еще, где я могу просмотреть изображение (независимо от того, где). Код, который я сейчас использую:

public class SimpleCryptoActivity extends Activity {
    private static final int IO_BUFFER_SIZE = 4 * 1024;
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

                try {
                    AssetManager am = this.getAssets();
                    InputStream is = am.open("2000_1.jpg_encrypted"); // get the encrypted image from assets folder

                    ByteArrayOutputStream baos = new ByteArrayOutputStream();  
                    byte[] b = new byte[IO_BUFFER_SIZE];  
                    int read;  
                    while ((read = is.read(b)) != -1) {  //convert inputstream to bytearrayoutputstream
                        baos.write(b, 0, read);
                    }                           
                long start = System.currentTimeMillis()/1000L; // start

                    byte[] keyStart = "MARTIN_123_MARTIN_123".getBytes();  // specific key value 
                    KeyGenerator kgen = KeyGenerator.getInstance("AES");    //aes
                    SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
                    sr.setSeed(keyStart);
                    kgen.init(128, sr); 
                    SecretKey skey = kgen.generateKey();
                    byte[] key = skey.getEncoded();    

                    byte[] decryptedData = decrypt(key,b);  //decryption
                long end = System.currentTimeMillis()/1000L;    // end
                Log.i("TEST","Time start "+ String.valueOf(start)); //showing the strat in ms
                Log.i("TEST","Time end "+ String.valueOf(end));     //showing the end in ms
                    Bitmap bitmap = BitmapFactory.decodeByteArray(b , 0, b .length);    //decoding bytearrayoutputstream to bitmap



                    is.close(); // close the inputstream
                    baos.close(); // close the bytearrayoutputstream
                }
                catch(Exception e){
                    e.fillInStackTrace();
                }
            } 

            //decrypt
            private byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
                SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                cipher.init(Cipher.DECRYPT_MODE, skeySpec);
                byte[] decrypted = cipher.doFinal(encrypted);

            return decrypted;
            }
}

Еще один вопрос. Мне любопытно, почему я не вижу

Log.i("TEST","Time start "+ String.valueOf(start)); //showing the strat in ms
                Log.i("TEST","Time end "+ String.valueOf(end));     //showing the end in ms

в LogCat. Я делаю что-то не так или ...? Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 26 июля 2011

Если не важно, храните ли вы его на SD-карте или в каком-либо хранилище вообще.Вы можете добавить ImageView в свой макет и сделать

ImageView mydecrptimg = (ImageView)findViewById(R.id.imageview);

mydecrptimg.setImageBitmap(yourbitmap);

или сохранить его в MediaStore.Подробнее об этом провайдере читайте здесь

http://developer.android.com/reference/android/provider/MediaStore.Images.Media.html

Редактировать: поместите этот класс в текущий класс, а затем создайте экземпляр для вашего ImageView

 private class DrawMyBitmap extends ImageView{

        private Bitmap bmp = null;
        public DrawMyBitmap(Context context, Bitmap mybmp) {
            super(context);
            this.bmp=mybmp;
        }

        @Override
        protected void onDraw(Canvas canvas) {

             Paint paint = new Paint();

             paint.setFilterBitmap(true);
             paint.setAntiAlias(true);

             Rect bmprect = new Rect(0 ,0 , bmp.getHeight(), bmp.getWidth() );
             canvas.drawBitmap(bmp, null, bmprect, paint);
            super.onDraw(canvas);
        }
0 голосов
/ 26 июля 2011

Где вы устанавливаете файл, который хотите записать?

У вас есть разрешение WRITE_EXTERNAL_STORAGE в манифесте?

Может быть, Logcat потерял фокус, идив перспективе DDMS и нажмите на эмуляторе, на котором запущено ваше приложение.Также установите выходной уровень Log на Debug на правом конце консоли Logcat.

Редактировать: для записи байтов в файл:

    FileOutputStream fos = new FileOutputStream(strFilePath);
    fos.write(bytes);
    fos.close();
...