2012-04-16 9 views
2

現在、Android用のカメラアプリケーションを開発中ですが、問題が発生しています。すべてのAndroid搭載端末で動作する必要があります。これらはすべて、カメラのハードウェアとは別の方法で動作するため、すべての端末で機能するソリューションを見つけるのは難しいです。すべてのAndroid搭載端末用のカメラアプリケーション

私のアプリケーションの主な目的は、ボタンクリックでカメラを起動し、写真を撮ってサーバーにアップロードすることです。だから私は本当にデバイスにイメージを保存する機能は必要ありませんが、それがさらなるイメージの使用に必要ならば、私はそれを可能にするかもしれません。

たとえば、Samsung Galaxy SIIとMotorola Padでアプリケーションをテストしています。私は私が使用しているので、仕方C#コードでMonodroidあるカメラ、起動コード働いてしまった:

Intent cameraIntent = new Intent(Android.Provider.MediaStore.ActionImageCapture); 
StartActivityForResult(cameraIntent, PHOTO_CAPTURE); 

をそして私は私が続くこのガイドと同様の結果を、フェッチ: http://kevinpotgieter.wordpress.com/2011/03/30/null-intent-passed-back-on-samsung-galaxy-tab/ 私はこれに続くのはなぜガイドは私の銀河のデバイス(別のデバイス指向の問題)でnullを返すためです。

このコードはGalaxyデバイスで正常に動作します。それは、写真を撮って、私がサーバーにアップロードできるギャラリーに写真を保存します。さらなる研究によって、これは明らかに銀河の標準的な動作であるため、これはMotorolaのパッドでは機能しません。カメラは正常に動作しますが、画像はギャラリーに保存されません。

この背景で私の質問は、私は正しい道にここにいるのですか?アプリケーションでさらに使用するには、画像をギャラリーに保存する必要がありますか?すべてのAndroid搭載端末で機能するソリューションはありますか?それは私が必要とするソリューションです。

フィードバックありがとうございます。

答えて

1

to long2know: はい、同じ概念がMonodroidに適用されます。私は既にあなたが他の類似物とリンクしているスタック記事を読んだ。しかし、コレクションにハードコードされたいくつかのデバイスのバグをチェックするので、私はその特定の投稿のアプローチが気に入らない。将来のデバイスでバグを検出できない可能性があります。私はこのアプリケーションでメンテナンスをしないので、私はこれを許可することはできません。私は他の場所で解決策を見つけ、それを私のケースに適用しました。誰かがそれを必要とするなら、私はそれを下に掲載します。両方のデバイスで動作し、大半の他のデバイスで動作すると考えられます。あなたのポストに感謝します!

画像をスナップして使用するソリューションで、ギャラリーの画像を使用するオプションもあります。ソリューションは、これらの目的のためにテストのためだけにオプションメニューを使用します。 (モノドロイドコード)。私はあなたのコードを、次の午前 access to full resolution pictures from camera with MonoDroid

namespace StackOverFlow.UsingCameraWithMonodroid 
{ 
    [Activity(Label = "ImageActivity")] 
    public class ImageActivity 
     private readonly static int TakePicture = 1; 
     private readonly static int SelectPicture = 2; 
     private string imageUriString; 

     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 
      this.SetContentView(Resource.Layout.ImageActivity); 
     } 

     public override bool OnCreateOptionsMenu(IMenu menu) 
     { 
      MenuInflater flate = this.MenuInflater; 
      flate.Inflate(Resource.Menu.ImageMenues, menu); 

      return base.OnCreateOptionsMenu(menu); 
     } 

     public override bool OnOptionsItemSelected(IMenuItem item) 
     { 
      switch (item.ItemId) 
      { 
       case Resource.Id.UseExisting: 
        this.SelectImageFromStorage(); 
        return true; 
       case Resource.Id.AddNew: 
        this.StartCamera(); 
        return true; 
       default: 
        return base.OnOptionsItemSelected(item); 
      } 
     } 

     private Boolean isMounted 
     { 
      get 
      { 
       return Android.OS.Environment.ExternalStorageState.Equals(Android.OS.Environment.MediaMounted); 
      } 
     } 

     private void StartCamera() 
     { 
      var imageUri = ContentResolver.Insert(isMounted ? MediaStore.Images.Media.ExternalContentUri 
            : MediaStore.Images.Media.InternalContentUri, new ContentValues()); 

      this.imageUriString = imageUri.ToString(); 

      var cameraIntent = new Intent(MediaStore.ActionImageCapture); 
      cameraIntent.PutExtra(MediaStore.ExtraOutput, imageUri); 
      this.StartActivityForResult(cameraIntent, TakePicture); 
     } 

     private void SelectImageFromStorage() 
     { 
      Intent intent = new Intent(); 
      intent.SetType("image/*"); 
      intent.SetAction(Intent.ActionGetContent); 
      this.StartActivityForResult(Intent.CreateChooser(intent, 
        "Select Picture"), SelectPicture); 

     } 

     // Example code of using the result, in my case i want to upload in another activity 
     protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) 
     { 
      // If a picture was taken 
      if (resultCode == Result.Ok && requestCode == TakePicture) 
      { 
       // For some devices data can become null when using the camera activity. 
       // For this reason we save pass the already saved imageUriString to the upload activity 
       // in order to adapt to every device. Instead we would want to use the data intent 
       // like in the SelectPicture option. 

       var uploadIntent = new Intent(this.BaseContext, typeof(UploadActivity)); 
       uploadIntent.PutExtra("ImageUri", this.imageUriString); 
       this.StartActivity(uploadIntent); 
      } 
      // User has selected a image from storage 
      else if (requestCode == SelectPicture) 
      { 
       var uploadIntent = new Intent(this.BaseContext, typeof(UploadActivity)); 
       uploadIntent.PutExtra("ImageUri", data.DataString); 
       this.StartActivity(uploadIntent); 
      } 
     } 
    } 
} 
+0

が、data.DataStringは私のためにnullである..:

カメラのコードが触発されます –

1

リンクされた記事を読んだあと、その記事で取り上げたアプローチはギャラリーに自動的に書き込むように見えるので、ギャラクシーラインに合わせてアプローチします。

この記事では詳細にいくつかの他のシナリオについて説明します。

Android ACTION_IMAGE_CAPTURE Intent

だから、私は必ずしもあなたが提供するリンク先の記事を以下は正しい道であるとは思いません。その記事afaikで説明されているように、すべてのデバイスが自動的にギャラリーに書き込むわけではありません。私がリンクした記事では、セキュリティに関連する問題を指摘し、元のイメージを保存するために/ sdcard/tmpフォルダにイメージを書き込むことを提案しています。同様の経路をたどっていくと、多くのデバイスで確実に動作するようなコードにつながる可能性が高くなります。ここで

参照のために他のいくつかのリンクです:その議論/プロジェクトは、Java/AndroidのSDKにある間、https://github.com/johnyma22/classdroid

:このテーマに関する

、Googleの議論:問題への潜在的な解決策とhttp://code.google.com/p/android/issues/detail?id=1480 プロジェクトMonodroidにも同じ概念が適用されるはずです。あなたが助けが必要な場合は、コードをAndroid用モノラルモノに適応させることをお手伝いいたします。

関連する問題