0

私は、カメラの意図から写真ファイルを提供するタスクを持つコンポーネントを作成する必要があります。 これまで、私は結果のための別のアクティビティを開始してそれを待って、活動中のそれらのことをしました。 しかし、ここでは、UIレイヤ(アクティビティ)へのアクセスがないビジネスロジックレイヤーからそのコンポーネントを使用したいと考えています。 これらの要件を満たすコンポーネントを作成するにはどうすればよいですか?結果のインテントを開始する必要がある場合、コンポーネントをアクティビティから分離する方法は?

答えて

2
  1. は、カスタムでApplicationクラスはインスタンスAppクラスの静的ゲッターを作成してcontext利用できるようにします。

    public class App extends Application { 
        private static App instance; 
    
        @Override 
        public void onCreate() { 
         instance = this; 
        } 
    
        public static App getInstance(){ 
         return instance; 
        } 
    } 
    

    あなたは依存性の注入を使用している場合、私は強く、それによってAppクラスを提供お勧めします。

  2. コンポーネントで実行可能な操作を記述するコンポーネント用のインターフェイスを作成します。ここでは、関数takePhoto()と、の2つの別の関数を追加します。は、リスナーを削除します。 PhotoTakerListenerからPhotoTakerComponent

    public interface PhotoTakerComponent { 
        void takePhoto(); 
        void addListener(PhotoTakerListener listener); 
        void removeListener(PhotoTakerListener listener); 
    } 
    
  3. 実装は、リスナーにより、当社のbiusness層のクラスと通信します。

    public interface PhotoTakerListener { 
        void onPhotoTaken(Boolean success, String path); 
    } 
    
  4. PhotoTakerActivityを作成します。このアクティビティはレイアウトのないコンポーネント内部クラスになります。正しい意図を開始するためにのみ開始し、onActivityResultメソッドで再呼び出しを待ちます。結局のところ、これは即座に終了します。レイアウトを膨らませないため、このアクティビティは表示されません。 takePhoto()方法では、我々は内部PhotoTakerActivityを始めるところ我々はPhotoTakerComponentインタフェースの実装を作成する必要があり、最後のステップで

    public class PhotoTakerActivity extends AppCompatActivity { 
    
        ... 
    
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
    
         ... 
    
         Uri uri = Uri.parse(mFileName); 
    
         Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
         intent.putExtra(MediaStore.EXTRA_OUTPUT, **uri**); 
    
         if (intent.resolveActivity(getPackageManager()) != null) { 
          startActivityForResult(intent, RequestImageCapture); 
         } 
        } 
    
        @Override 
        protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
         super.onActivityResult(requestCode, resultCode, data); 
    
         if (requestCode == RequestImageCapture) { 
          if (resultCode == RESULT_CANCELED){ 
           for (PhotoTakerListener listener: listeners) { 
            listener.onPhotoTaken(false, null); 
           } 
          } else if (resultCode == RESULT_OK){ 
           for (PhotoTakerListener listener: listeners){ 
            listener.onPhotoTaken(true, mFileName); 
           } 
          } 
         } 
    
         finish(); 
        } 
    } 
    
  5. public class DefaultPhotoTakerComponent implements PhotoTakerComponent { 
        private Context mApplicationContext; 
    
        public DefaultPhotoTakerComponent() { 
         mApplicationContext = App.getInstance().getApplicationContext(); 
        } 
    
        @Override 
        public void takePhoto() { 
         if (mApplicationContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 
          try { 
    
           ... 
    
           Intent intent = new Intent(mApplicationContext, PhotoTakerActivity.class); 
           intent.putExtra(PhotoTakerActivity.ExtraFileName, Uri.fromFile(image).toString()); 
           intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    
           mApplicationContext.startActivity(intent); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
         } 
        } 
    
        public void addListener(PhotoTakerListener listener){ 
         PhotoTakerActivity.addListener(listener); 
        } 
    
        public void removeListener(PhotoTakerListener listener){ 
         PhotoTakerActivity.removeListener(listener); 
        } 
    } 
    

サンプル・アプリケーションは、Githubの上で提供されています:HereC# Xamarin.Android用:Here

Java Android用

関連する問題