素人のアンドロイドアプリ開発日記

カメラアプリのコンテンツ

androidの本体のデータベースに登録したのに見れない。(不具合)

2011.04.22

カメラアプリを作成して、画像の保存をした時に、

保存だけでは、ギャラリーなどに表示ができないので、

データベースに登録をしていたのですが、反映されてない場合を確認しました。

※galaxy s

values.put(Images.Media.MIME_TYPE, "image/jpeg");
values.put("_data", imgName);

上記のように形式とパスのみを記載していたのですが、

values.put(Images.Media.TITLE, imgName);

のようにタイトルも必須項目のようでした。

その他の部分は変更しておりませんが、前回までのソースは下記へ変更しております。

private Camera.PictureCallback mPictureListener =new Camera.PictureCallback() {
 public void onPictureTaken(byte[] data, Camera camera) {
 myCamera.startPreview();
 if (data != null) {
 if(!sdcardWriteReady()){
 Toast.makeText(context, "SDCARDが認識されません。", Toast.LENGTH_SHORT).show();
 bool = true;
 return;
 }
 FileOutputStream foStream = null;
 //フォルダのパスを表示します。。
 File file = new File(Environment.getExternalStorageDirectory().getPath() + "/cmr2/");
 //フォルダが存在しなかった場合にフォルダを作成します。
 if(!file.exists()){
 file.mkdir();
 }
 //これで他のとかぶらない名前の設定ができました。
 String imgName = Environment.getExternalStorageDirectory().getPath() + "/cmr2/" + System.currentTimeMillis() +".jpg";
 try {
 foStream = new FileOutputStream(imgName);
 foStream.write(data);
 foStream.close();
 ContentValues values = new ContentValues();
 ContentResolver contentResolver = context.getContentResolver();
 values.put(Images.Media.MIME_TYPE, "image/jpeg");
 values.put(Images.Media.TITLE, imgName);
 values.put("_data", imgName);
 try {
 contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
 }catch(Exception e){
 Toast.makeText(context, "再起動後に画像が認識されます。", Toast.LENGTH_SHORT).show();
 e.printStackTrace();
 }
 } catch (Exception e) {
 Toast.makeText(context, "ファイルの保存中にエラーが発生しました。", Toast.LENGTH_SHORT).show();
 e.printStackTrace();
 }
 bool = true;
 }else{
 Toast.makeText(context, "データが取得できませんでした。", Toast.LENGTH_SHORT).show();
 bool = true;
 }
 }
 };

 

カテゴリー:カメラアプリ

カメラアプリで歪んだプレビューが表示されてしまう問題

2011.04.21

これは、出る人と出ない人がいると思いますが、僕の方で違和感の出るくらいに表示されていたので、解決してみました。

(多くのカメラアプリのレクチャーでは、画像の保存を行うだけで、データベースの保存やディレクトリの作成、判別をしてないからかと思うのですが。。)

画像を保存した後にプレビューの画面が一瞬ですが歪んで見えます。

この原因の箇所はどうやら、takePictureのjpg生成の部分で発生がしているようでした。

前回までの流れで、「sdカードを確認⇒保存⇒カメラのプレビューを再開」でした。

ここで、カメラのプレビュー再開の時に何か問題が?

と思って、カメラのプレビューを再開をやめたらゆがみっぱなしでした。

startPreview()

に関してですが、始まるまで歪んでいるようだったので、「カメラのプレビューを再開⇒sdカードを確認⇒保存」に変更をしてみたところ歪まないで普通に表示ができました。

↓コールバックの部分

private Camera.PictureCallback mPictureListener =new Camera.PictureCallback() {
 public void onPictureTaken(byte[] data, Camera camera) {
 myCamera.startPreview();
 if (data != null) {
 if(!sdcardWriteReady()){
 Toast.makeText(context, "SDCARDが認識されません。", Toast.LENGTH_SHORT).show();
 bool = true;
 return;
 }
 FileOutputStream foStream = null;
 //フォルダのパスを表示します。。
 File file = new File(Environment.getExternalStorageDirectory().getPath() + "/cmr/");
 //フォルダが存在しなかった場合にフォルダを作成します。
 if(!file.exists()){
 file.mkdir();
 }
 //これで他のとかぶらない名前の設定ができました。
 String imgName = Environment.getExternalStorageDirectory().getPath() + "/cmr/" + System.currentTimeMillis() +".jpg";
 try {
 foStream = new FileOutputStream(imgName);
 foStream.write(data);
 foStream.close();
 ContentValues values = new ContentValues();
 ContentResolver contentResolver = context.getContentResolver();
 values.put(Images.Media.MIME_TYPE, "image/jpeg");
 values.put("_data", imgName);
 try {
 contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
 }catch(Exception e){
 Toast.makeText(context, "再起動後に画像が認識されます。", Toast.LENGTH_SHORT).show();
 e.printStackTrace();
 }
 } catch (Exception e) {
 Toast.makeText(context, "ファイルの保存中にエラーが発生しました。", Toast.LENGTH_SHORT).show();
 e.printStackTrace();
 }
 bool = true;
 }else{
 Toast.makeText(context, "データが取得できませんでした。", Toast.LENGTH_SHORT).show();
 bool = true;
 }
 }
 };

実際にデータをjpgに圧縮などしているのでその過程の産物なような気がします。

メモリ的な事を考えると、とめておいた方がよいような気もしますが、

また、何か分かりましたらご報告します。

カテゴリー:カメラアプリ

カメラアプリでautofocusで実装する。

2011.04.21

前回のカメラアプリデータを利用します。

カメラで撮影をして保存してみる。

 

autoFocusの実装は既に機能として、用意されています。

public void autoFocus(){
 if( myCamera != null ){
 // オートフォーカスのあと撮影に行くようにコールバック設定
 myCamera.autoFocus( new Camera.AutoFocusCallback() {
 @Override
 public void onAutoFocus(boolean success, Camera camera) {
 camera.autoFocus( null );
 myCamera.takePicture(null, null, mPictureListener);
 });
 }
}

カメラにauto focusを実装にはautoFucusを実装するとフォーカスをした瞬間にtakePictureを呼び出すので、綺麗な写真を取れます。

 

しかし、実機で落ちます。。(galaxy s)

 

多くのサイトでマニフェストの設定と書いてあったので、

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="in.andante.camerapre"
 android:versionCode="1"
 android:versionName="1.0">
 <uses-sdk android:minSdkVersion="7" />
 <uses-permission android:name="android.permission.CAMERA"></uses-permission>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
 <uses-feature android:name="android.hardware.camera" />
 <uses-feature android:name="android.hardware.camera.autofocus" />
 <application android:icon="@drawable/icon" android:label="@string/app_name">
 <activity android:name=".CameraPre"
 android:label="@string/app_name"
 android:screenOrientation="landscape"
 android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
 <intent-filter>
 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>
 </activity>

 </application>
</manifest>

で、変更したのですがuser-featureは使える機種を限定するだけで使用の際につける義務はなかった気がしたのですが、これでも解決はしませんでした。(エミュレーターで動いていたので。。)

 

なぜ落ちるのか。と下記の仮定をしました。

「実際にautofocusとカメラの取得を同時に行う事で、メモリ過多になり、落ちているのかな。。と」

 

takePictureのcallback関数が実行されていないようです。

なので、autofocusが完了後に時間を置いて写真を撮ってみます。

Thread trd = new Thread(new Runnable(){
 public void run() {
 try{
 Thread.sleep(1000);
 }catch(Exception e){}
 myCamera.takePicture(null, null, mPictureListener);
 };
});
trd.start();

で1秒後に実行されますが、これでは、フォーカスがあった状態の写真じゃなく、フォーカスがあった「一秒後」の写真になってしまいます。

なので、フォーカスがあった段階で、プレビューの更新をとめます。

camera.stopPreview();

上記をいれる事で遅延させてカメラの画像取得、及び保存を実行しています。

public void autoFocus(){
 if( myCamera != null ){
 myCamera.autoFocus( new Camera.AutoFocusCallback() {
 @Override
 public void onAutoFocus(boolean success, Camera camera) {
 camera.autoFocus( null );
 camera.stopPreview();
 //myCamera.takePicture(null, null, mPictureListener);
 Thread trd = new Thread(new Runnable(){
 public void run() {
 try{
 Thread.sleep(1000);
 }catch(Exception e){}
 myCamera.takePicture(null, null, mPictureListener);
 };
 });
 trd.start();
 }
 });
 }
}

これを画面に触れた段階で実行するので

public boolean onTouchEvent(MotionEvent event) {
 if (event.getAction() == MotionEvent.ACTION_DOWN) {
 if (myCamera != null && bool) {
 bool = false;
 autoFocus();
 //myCamera.takePicture(mShutterListener, null, mPictureListener);
 }
 }
 return true;
}

今回に関しては、1秒後の実行ですが、この秒数をもっと短くしても問題ありません。

しかし、秒数を短くする事で負荷を上げてしまう可能性があります。

実機でのテストを重ねて最適の負荷の時間を探すのがベストです。

 

多くの写真アプリでもフォーカス後に時間がかかっているものが多いので、この仕様なのかと推定しています。

ソース全体は下記です。

package in.andante.camerapre;

import java.io.*;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.hardware.Camera;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;

public class CameraView extends SurfaceView implements SurfaceHolder.Callback{
 private Camera myCamera;
 private Context context;
 private Boolean bool = true;
 public CameraView(Context context){
 super(context);
 this.context = context;
 getHolder().addCallback(this);
 getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 }

 public void surfaceCreated(SurfaceHolder holder){
 myCamera = Camera.open();
 try {
 myCamera.setPreviewDisplay(holder);
 } catch (Exception e) {
 e.printStackTrace();
 }
 }

 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){
 Camera.Parameters parameters = myCamera.getParameters();
 //parameters.setPreviewSize(width, height);不要でした。すいません。
 myCamera.setParameters(parameters);
 myCamera.startPreview();
 }

 public void surfaceDestroyed(SurfaceHolder holder){
 myCamera.release();
 myCamera = null;
 }

 // JPEGイメージ生成後に呼ばれるコールバック
 private Camera.PictureCallback mPictureListener =new Camera.PictureCallback() {
 public void onPictureTaken(byte[] data, Camera camera) {
 if (data != null) {
 if(!sdcardWriteReady()){
 Toast.makeText(context, "SDCARDが認識されません。", Toast.LENGTH_SHORT).show();
 bool = true;
 camera.startPreview();
 return;
 }
 FileOutputStream foStream = null;
 //フォルダのパスを表示します。。
 File file = new File(Environment.getExternalStorageDirectory().getPath() + "/cmr/");
 //フォルダが存在しなかった場合にフォルダを作成します。
 if(!file.exists()){
 file.mkdir();
 }
 //これで他のとかぶらない名前の設定ができました。
 String imgName = Environment.getExternalStorageDirectory().getPath() + "/cmr/" + System.currentTimeMillis() +".jpg";

 try {
 foStream = new FileOutputStream(imgName);
 foStream.write(data);
 foStream.close();

 ContentValues values = new ContentValues();
 ContentResolver contentResolver = context.getContentResolver();
 values.put(Images.Media.MIME_TYPE, "image/jpeg");
 values.put("_data", imgName);
 try {
 contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
 }catch(Exception e){
 Toast.makeText(context, "再起動後に画像が認識されます。", Toast.LENGTH_SHORT).show();
 e.printStackTrace();
 }
 } catch (Exception e) {
 Toast.makeText(context, "ファイルの保存中にエラーが発生しました。", Toast.LENGTH_SHORT).show();
 e.printStackTrace();
 }
 bool = true;
 camera.startPreview();
 }else{
 Toast.makeText(context, "データが取得できませんでした。", Toast.LENGTH_SHORT).show();
 bool = true;
 camera.startPreview();
 }
 }
 };

 @Override
 public boolean onTouchEvent(MotionEvent event) {
 if (event.getAction() == MotionEvent.ACTION_DOWN) {
 if (myCamera != null && bool) {
 bool = false;
 autoFocus();
 //myCamera.takePicture(mShutterListener, null, mPictureListener);
 }
 }
 return true;
 }

 //書き込みができるかどうかを判別する関数
 public boolean sdcardWriteReady(){
 String state = Environment.getExternalStorageState();
 return (Environment.MEDIA_MOUNTED.equals(state));
 }

 // オートフォーカス
 public void autoFocus(){
 if( myCamera != null ){
 // オートフォーカスのあと撮影に行くようにコールバック設定
 myCamera.autoFocus( new Camera.AutoFocusCallback() {
 @Override
 public void onAutoFocus(boolean success, Camera camera) {
 camera.autoFocus( null );
 camera.stopPreview();
 //myCamera.takePicture(null, null, mPictureListener);
 Thread trd = new Thread(new Runnable(){
 public void run() {
 try{
 Thread.sleep(1000);
 }catch(Exception e){}
 myCamera.takePicture(null, null, mPictureListener);
 };
 });
 trd.start();
 }
 });
 }
 }
}

以上です。

カテゴリー:カメラアプリ

カメラで撮影をして保存してみる。

2011.04.20

androidでカメラを使ってみる。

で画面にカメラの映像を表示できたので、今度は移した画像を撮影して保存してみたいと思います。

今回は:カメラの使用方法(2)を参考にさせていたふぁきました。

画像を取得する為にはmyCamera.takePicture()を実行すると、キャプチャを取得してくれる。

タッチをした時に実行をするので、

@Override
public boolean onTouchEvent(MotionEvent event) {
 if (event.getAction() == MotionEvent.ACTION_DOWN) {
 if (myCamera != null)
 myCamera.takePicture(mShutterListener, null, mPictureListener);
 }
 }
 return true;
}

とします。

takePicture()には3つのデータを引数でcallback関数をいれるが、1つ目はシャッターを切った瞬間、2つ目はrowデータを取得した段階、3つ目はjpegに圧縮した段階で実行がされる。

rawデータは十分な要領がなければコピーできないので、nullかもしれないようです。

なので必然的に3つ目の関数で画像の保存などを行います。

private Camera.PictureCallback mPictureListener =new Camera.PictureCallback() {
 public void onPictureTaken(byte[] data, Camera camera) {
 
 }
};

が画像の保存の部分です。

最初にデータの取得を確認をします。

if (data != null) {
//空じゃない場合
}

次に以前ファイルの保存で勉強したように

private boolean sdcardWriteReady(){
 String state = Environment.getExternalStorageState();
 return (Environment.MEDIA_MOUNTED.equals(state));
}

を用意して、保存ができるかの確認をしてみます。

if(sdcardWriteReady()){
//保存できる。
}

次にディレクトリを用意してディレクトリが存在しない場合はディレクトリを作成します。

File file = new File(Environment.getExternalStorageDirectory().getPath() + "/cmr/");
if(!file.exists()){
 file.mkdir();
}

他の画像と被らないようなファイル名を用意します。

String imgName = Environment.getExternalStorageDirectory().getPath() + "/cmr/" + System.currentTimeMillis() +".jpg";

作成した名前のファイルに画像を保存します。

foStream = new FileOutputStream(imgName);
foStream.write(data);
foStream.close();

アンドロイドのデータベースへの登録を行います。※登録をしないとギャラリーなどですぐに確認できません。

ContentValues values = new ContentValues();
ContentResolver contentResolver = context.getContentResolver();
values.put(Images.Media.MIME_TYPE, "image/jpeg");
values.put("_data", imgName);
contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

以上で完了です。

上記の分岐でエラーが出現した場合の文言を任意で決めて作成をします。また、連打防止の対策なども含めております。

package in.andante.camerapre;

import java.io.*;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.hardware.Camera;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;
 
public class CameraView extends SurfaceView implements SurfaceHolder.Callback{
 private Camera myCamera;
 private Context context;
 private Boolean bool = true;
 public CameraView(Context context){
 super(context);
 this.context = context;
 getHolder().addCallback(this);
 getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 }
 
 public void surfaceCreated(SurfaceHolder holder){
 myCamera = Camera.open();
 try {
 myCamera.setPreviewDisplay(holder);
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 
 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){
 Camera.Parameters parameters = myCamera.getParameters();
 //parameters.setPreviewSize(width, height)不要でした。すいません;
 myCamera.setParameters(parameters);
 myCamera.startPreview();
 }
 
 public void surfaceDestroyed(SurfaceHolder holder){
 myCamera.release();
 myCamera = null;
 }
 
 // シャッターが押されたときに呼ばれるコールバック
 private Camera.ShutterCallback mShutterListener = new Camera.ShutterCallback() {
 public void onShutter() {
 // TODO Auto-generated method stub
 }
 };
 
 // JPEGイメージ生成後に呼ばれるコールバック
 private Camera.PictureCallback mPictureListener =new Camera.PictureCallback() {
 public void onPictureTaken(byte[] data, Camera camera) {
 if (data != null) {
 if(!sdcardWriteReady()){
 Toast.makeText(context, "SDCARDが認識されません。", Toast.LENGTH_SHORT).show();
 bool = true;
 camera.startPreview();
 return;
 }
 FileOutputStream foStream = null;
 //フォルダのパスを表示します。。
 File file = new File(Environment.getExternalStorageDirectory().getPath() + "/cmr/");
 //フォルダが存在しなかった場合にフォルダを作成します。
 if(!file.exists()){
 file.mkdir();
 }
 //これで他のとかぶらない名前の設定ができました。
 String imgName = Environment.getExternalStorageDirectory().getPath() + "/cmr/" + System.currentTimeMillis() +".jpg";
 
 try {
 foStream = new FileOutputStream(imgName);
 foStream.write(data);
 foStream.close();
 
 ContentValues values = new ContentValues();
 ContentResolver contentResolver = context.getContentResolver();
 values.put(Images.Media.MIME_TYPE, "image/jpeg");
 values.put("_data", imgName);
 try {
 contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
 }catch(Exception e){
 Toast.makeText(context, "再起動後に画像が認識されます。", Toast.LENGTH_SHORT).show();
 e.printStackTrace();
 }
 } catch (Exception e) {
 Toast.makeText(context, "ファイルの保存中にエラーが発生しました。", Toast.LENGTH_SHORT).show();
 e.printStackTrace();
 }
 bool = true;
 camera.startPreview();
 }else{
 Toast.makeText(context, "データが取得できませんでした。", Toast.LENGTH_SHORT).show();
 bool = true;
 camera.startPreview();
 }
 }
 };
 
 @Override
 public boolean onTouchEvent(MotionEvent event) {
 if (event.getAction() == MotionEvent.ACTION_DOWN) {
 if (myCamera != null && bool) {
 bool = false;
 myCamera.takePicture(mShutterListener, null, mPictureListener);
 }
 }
 return true;
 }
 
 //書き込みができるかどうかを判別する関数
 private boolean sdcardWriteReady(){
 String state = Environment.getExternalStorageState();
 return (Environment.MEDIA_MOUNTED.equals(state));
 }
}

またmanifestは以下です。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="in.andante.camerapre"
 android:versionCode="1"
 android:versionName="1.0">
 <uses-sdk android:minSdkVersion="7" />
 <uses-permission android:name="android.permission.CAMERA"></uses-permission>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 <application android:icon="@drawable/icon" android:label="@string/app_name">
 <activity android:name=".CameraPre"
 android:label="@string/app_name"
 android:screenOrientation="landscape"
 android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
 <intent-filter>
 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>
 </activity>

 </application>
</manifest>

メインのjavaのファイルは以下です。

package in.andante.camerapre;

import android.app.Activity;
import android.os.Bundle;

public class CameraPre extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 CameraView view = new CameraView(this);
 setContentView(view);
 //setContentView(R.layout.main);
 }
 
 protected void onResume(){
 super.onResume();
 }
 
 protected void onStop(){
 super.onStop();
 }
 
 
 public void onDestroy(){
 super.onDestroy();
 }
}

以上です。

カテゴリー:カメラアプリ

androidでカメラを使ってみる。

2011.04.20

前回作成したsurfaceviewを利用して、今度は画面にカメラの画像を表示したいと思います。

カメラを利用する為に、マニフェストを追加します。

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

surfaceviewを継承したクラスを作成する。

package in.andante.camerapre;

import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CameraView extends SurfaceView implements SurfaceHolder.Callback{

 private Camera myCamera;

 public CameraView(Context context){
 super(context);
 getHolder().addCallback(this);
 getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 }

 public void surfaceCreated(SurfaceHolder holder){
 myCamera = Camera.open();
 try {
 myCamera.setPreviewDisplay(holder);
 } catch (Exception e) {
 e.printStackTrace();
 }
 }

 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){
 Camera.Parameters parameters = myCamera.getParameters();
 parameters.setPreviewSize(width, height);
 myCamera.setParameters(parameters);
 myCamera.startPreview();
 }

 public void surfaceDestroyed(SurfaceHolder holder){
 myCamera.release();
 myCamera = null;
 }
}

上記でカメラを表示するViewを作成できました。

package in.andante.camerapre;

import android.app.Activity;
import android.os.Bundle;

public class CameraPre extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 CameraView view = new CameraView(this);
 setContentView(view);
 //setContentView(R.layout.main);
 }

 protected void onResume(){
 super.onResume();
 }

 protected void onStop(){
 super.onStop();
 }

 public void onDestroy(){
 super.onDestroy();
 }
}

上記を実行すれば、画面にカメラのプレビューを表示したアプリができます。

 

ですが、なぜか撮影している画像が90度回転しています。

 

これは、アンドロイドのアプリのカメラが横画面を基準に作成がされているからです。

なので画面のモードを変更する為に、画面の向きを変更します。

お絵かきアプリtips

の記事で、触れていますが、画面の向きを変更する為には

android:screenOrientation="landscape"

を設定します。(manifestです)

マニフェストのxmlは下記のようになりました。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="in.andante.camerapre"
 android:versionCode="1"
 android:versionName="1.0">
 <uses-sdk android:minSdkVersion="7" />
 <uses-permission android:name="android.permission.CAMERA"></uses-permission>

 <application android:icon="@drawable/icon" android:label="@string/app_name">
 <activity android:name=".CameraPre"
 android:label="@string/app_name"
 android:screenOrientation="landscape">
 <intent-filter>
 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>
 </activity>

 </application>
</manifest>

以上です。

今回はpreviewの表示だったので、次は撮影をしてみたいと思います。

カテゴリー:カメラアプリ

公開中のアプリ、是非ダウンロードしてみてください

2chまとめのたね

RSSを利用してさまざまなブログの情報をキュレーションしてくれるアプリ

インストールする

ひらがな戦記

OPENGL ES2 を利用したカルタのソーシャルゲーム

インストールする