Androidのアクティビティとフラグメントがちょっと乱雑になってきています。そして、私はいくつかの良いコーディング方法を適用したいと思います。しかし、私は良いソリッドデザインを思いつくたびに、Androidは方法で取得します!Androidインテントへのコールの抽象化
私は具体的な例として、ユーザーが詳細(名前、電子メールなど)を更新できるようにするための断片を持っています。また、プロフィール写真として使用するために写真を撮ることもできます。
私は、この「写真撮影」コードを別のインターフェイスに移動したいと考えています。それをPhotoTaker
としましょう。次に、正しいインテントを開始し、撮影した画像のファイル名を返すために、このインタフェースを実装するAndroidPhotoTaker
というクラスが必要です。
public interface PhotoTaker {
Uri capturePhoto();
}
public class AndroidPhotoTaker implements PhotoTaker {
private Context _context;
@Inject
public AndroidPhotoTaker(Context context) {
_context = context;
}
@Override
public Uri capturePhoto() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(_context.getPackageManager()) != null) {
File photoFile = new File("some/path/to/a/file");
Uri photoUri = FileProvider.getUriForFile(_context, _context.getApplicationContext().getPackageName() + ".provider", photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
_context.startActivity(takePictureIntent);
return photoUri;
}
return null;
}
}
Dagger2経由で正しいコンテキストが注入されたとします。
私の問題は、私がフラグメントで行ったように私がもはやstartActivityForResult()
を呼び出すことができないということです。したがって、私は結果を処理するためにもはやonActivityResult()
コールバックを持っていません。私が実際に見つけることができる唯一のものは_context.startActivity()
ですが、そうは思わしくありません。
コールバックはありません。将来的にこれらのインテントから余分なデータを取得したいと考えています。
この問題を他の人がどのように解決しましたか?ここでの一般的な解決策は何ですか?つまり、コールバックを持つAndroidのインテントコールをどのように抽象化しますか?私の意見で
への呼び出しです。これは単体テストのためのどんなモックをも妨げるでしょうか?つまり、ユニットテストのためにインテントを開始したくありません。 私は今Android用の単体テストを試みていますが、 – blowfly
私は同意します、静的メソッドはunittest-mockingを不可能にします。しかし、私は "unittest"アンドロイドのアクティビティの相互作用をdonotしません。コードを非静的にすることは自由です – k3b