2

私は現在、いくつかの問題が発生したAndroid用のカメラアプリケーションを開発しています。すべてのAndroidデバイスで動作する必要がありますが、これらはすべて、特にカメラハードウェアでさまざまな方法で動作するため、すべてのデバイスで動作するソリューションを見つけるのに苦労しています。

私のアプリケーションの主な目標は、ボタンをクリックしてカメラを起動し、写真を撮り、サーバーにアップロードすることです。したがって、デバイスに画像を保存する機能は実際には必要ありませんが、さらに画像を使用するためにそれが必要な場合は、許可したほうがよいでしょう。

たとえば、SamsungGalaxySIIとMotorolaPadでアプリケーションをテストしています。カメラを起動する動作するコードを取得しました。これは、Monodroidを使用しているためC#コードです。

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デバイスで機能するソリューションはありますか?それが私が必要とするソリューションです。

フィードバックをありがとう!

4

2 に答える 2

1

リンクされた記事を読んだ後、その記事で採用されたアプローチは、ギャラリーに自動的に書き込まれるように見えるため、Galaxyラインに向けられています。

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

AndroidACTION_IMAGE_CAPTUREインテント

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

参考のために他のリンクをいくつか示します。

このテーマに関するGoogleのディスカッション: http ://code.google.com/p/android/issues/detail?id = 1480 問題の解決策となる可能性のあるプロジェクト:https ://github.com/johnyma22/classdroid

そのディスカッション/プロジェクトはJava/Android SDKにありますが、同じ概念がMonodroidにも当てはまるはずです。ヘルプが必要な場合は、コードを動作するMonoforAndroidソリューションに適合させるお手伝いをさせていただきます。

于 2012-04-16T14:31:08.917 に答える
1

long2knowへ:はい、同じ概念がMonodroidにも当てはまります。あなたが他の同様のものとリンクしたスタックの記事をすでに読みました。ただし、コレクションにハードコードされている一部のデバイスのバグをチェックするため、その特定の投稿のアプローチは好きではありません。つまり、将来のデバイスでバグを検出できない可能性があります。このアプリケーションのメンテナンスを行わないため、これを許可することはできません。私は他の場所で解決策を見つけ、それを私のケースに適合させました。誰かがそれを必要とする場合は、以下に投稿します。それは私の両方のデバイスで動作し、他のデバイスの大部分で動作すると推測しています。投稿ありがとうございます!

写真を撮って使用できるソリューション。ギャラリーの画像を使用するオプションもあります。ソリューションは、テストのためだけに、これらの目的でオプションメニューを使用します。(モノドロイドコード)。

カメラコードは次のことに触発されています: 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);
            }
        }
    }
}
于 2012-04-18T08:55:35.257 に答える