2012-06-04 2 views
1

Я пытаюсь сделать снимок, и когда пользователь нажимает кнопку, я хочу сохранить изображение во внутреннем хранилище. Я буду тестировать на планшете, у которого нет SD-карты. Я также новичок в съемках на андроиде, и в Интернете не было никакой помощи, пытаясь найти, какой именно код мне нужен, чтобы записать его где-то, кроме SD-карты. Вот как выглядит моя камера.java.Съемка и сохранение ее во внутреннем хранилище

package com.test; 

import com.test.R; 

import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import android.app.Activity; 

import android.hardware.Camera; 
import android.hardware.Camera.PictureCallback; 
import android.hardware.Camera.ShutterCallback; 

import android.os.Bundle; 

import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.FrameLayout; 

public class camera extends Activity 
{ 
    private static final String TAG = "CameraDemo"; 
     Camera camera; 
     Preview preview; 
     Button buttonClick; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.camera); 

     preview = new Preview(this); 
     ((FrameLayout) findViewById(R.id.preview)).addView(preview); 

     buttonClick = (Button) findViewById(R.id.buttonClick); 
     buttonClick.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
      } 
     }); 

     Log.d(TAG, "onCreate'd"); 
    } 


    ShutterCallback shutterCallback = new ShutterCallback() { 
     public void onShutter() { 
      Log.d(TAG, "onShutter'd"); 
     } 
    }; 

    /** Handles data for raw picture */ 
    PictureCallback rawCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      Log.d(TAG, "onPictureTaken - raw"); 
     } 
    }; 

    /** Handles data for jpeg picture */ 
    PictureCallback jpegCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      FileOutputStream outStream = null; 
      try { 
       // write to local sandbox file system 
       outStream = camera.this.openFileOutput(String.format("%d.jpg", System.currentTimeMillis()), 0); 
       // Or write to sdcard 
       //outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));  
       outStream.write(data); 
       outStream.close(); 
       Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
      } 
      Log.d(TAG, "onPictureTaken - jpeg"); 
     } 
    }; 

} 
+1

FYI. Большинство устройств, которые не поддерживают съемное внешнее хранилище, по-прежнему имеют «внешнее хранилище», выделенное при паяной вспышке, которое можно найти через вызовы api. Хотя могут быть и исключения, и, конечно же, есть устройства, которые зависят от съемной карты, которая может отсутствовать, а также в случае, когда раздел хранения недоступен для приложений, поскольку он удаленно доступен для подключенного ПК. –

ответ

2

Не совсем ясно, с какой проблемой вы сталкиваетесь с этим кодом. Способ, которым вы открываете файл, кажется прекрасным, возможно, он ведет себя по-другому, это неверно?

Эта страница в Android документ содержит информацию об использовании различных видов памяти, доступной для вашего приложения: http://developer.android.com/guide/topics/data/data-storage.html

В частности, раздел о saving files that should be shared может быть полезным для вашей ситуации. Он ссылается на «внешнее хранилище», но многие устройства имитируют внешнее хранилище с использованием внутреннего хранилища, поэтому разработчику не нужно беспокоиться об этом.

Если вы хотите, чтобы изображение было доступно для просмотра в приложении «Галерея» системы, вы можете добавить его в сканирование носителей, используя MediaScannerConnection.scanFile. Однако это может не сработать, если вы храните файлы в частном хранилище вашего приложения с помощью openFileOutput.

0

Вы можете увидеть этот образец Picture Demo с сайта Github CommonsAware, это может быть полезно для вас.