繁体   English   中英

如何从 class 扩展 LinearLayout 访问相机?

[英]how to access the camera from class extending LinearLayout?

对不起,我是 java 新手,我需要使用 class 扩展 LinearLayout 的相机。

public class ImagePicker extends LinearLayout {

...

            mButton.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View view) {

                    Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    try{
                        startActivityForResult(takePhotoIntent, REQUEST_TAKE_PHOTO);
                    }catch (ActivityNotFoundException e){
                        e.printStackTrace();
                    }
                }
            });

...
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
             
  
        }

这些方法需要一个 class 扩展 Activity。 我怎样才能正确使用它们? 谢谢

有(至少)两种选择可以实现这一目标:

  • 您可以按照 stackoverflow.com/a/32973351/3738870 中的说明从 ImagePicker 获取活动。 但是,这种方法不太干净,因为 Intent 是在ImagePicker中发送的,但结果仍然必须在ActivityonActivityResult中接收。 最好从您请求的地方接收相同的 class 的结果。
  • 另一种方法是暴露按钮,然后在 Activity 中调用它的setOnClickListener 下面是一些示例代码,演示了如何执行此操作:

ImagePicker

    public class ImagePicker extends LinearLayout {
    
        private Button button;
    
        public ImagePicker(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
            View.inflate(context, R.layout.image_picker, this);
            button = findViewById(R.id.button);
        }
    
        public Button getButton() {
            return button;
        }
    }

Activity

    public class Activity extends AppCompatActivity {
    
        private static int REQUEST_TAKE_PHOTO = 99;
    
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
            super.onCreate(savedInstanceState, persistentState);
            setContentView(R.layout.activity_main2);
    
            ImagePicker imagePicker = findViewById(R.id.imagePicker);
            imagePicker.getButton().setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    try{
                        startActivityForResult(takePhotoIntent, REQUEST_TAKE_PHOTO);
                    }catch (ActivityNotFoundException e){
                        e.printStackTrace();
                    }
                }
            });
        }
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

一个更简单的解决方案是直接在 Activity 中获取 Button:

public class Activity extends AppCompatActivity {

    private static int REQUEST_TAKE_PHOTO = 99;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        setContentView(R.layout.activity_main2);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                try{
                    startActivityForResult(takePhotoIntent, REQUEST_TAKE_PHOTO);
                }catch (ActivityNotFoundException e){
                    e.printStackTrace();
                }
            }
        });
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM