代码之家  ›  专栏  ›  技术社区  ›  Bazz

Android对在应用程序中使用摄像头拍照并发送额外意图感到困惑

  •  -3
  • Bazz  · 技术社区  · 7 年前

    我正在尝试实现一个功能,如果有人拍照,它会用他们的图片替换最终页面源图像上的图片。我的演示程序运行得很好,但我在想要实现该功能的实际程序中遇到了问题。我正在学习本教程。我相信我的实际类和构造函数开始变得比我现在理解的更复杂。 https://developer.android.com/training/camera/photobasics.html

    package com.example.samue.interactivefamilystory.main.ui;
    
    import android.app.Activity; 
    import android.content.Intent; 
    import android.content.res.Resources; 
    import android.graphics.Bitmap; 
    import android.media.Image; 
    import android.provider.MediaStore; 
    import android.support.v7.app.AppCompatActivity; 
    import android.os.Bundle;
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.ImageButton;
    
    import com.example.samue.interactivefamilystory.R;
    
    public class MainActivity extends AppCompatActivity {
    
        private EditText nameField;
        private Button startButton;
        private ImageButton cameraButton;
    
        private static final int REQUEST_IMAGE_CAPTURE = 1;
        Bitmap thumbnailImage = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            nameField = (EditText) findViewById(R.id.edit_name_text);
            startButton = (Button) findViewById(R.id.start_button);
    
            //Set button click listener and set name to use for resource.
    
            startButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                   String name = nameField.getText().toString();
                   startStory(name);
                }
            });
    
            cameraButton = (ImageButton) findViewById(R.id.camera_button);
            cameraButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    takePictureIntent();
    
                }
            });
    
        }
        //start the story intent
        public void startStory(String name){
            Intent intent = new Intent(this, StoryActivity.class);
            intent.putExtra("name", name);
            intent.putExtra("picture",thumbnailImage);
            startActivity(intent);
    
        }
        //take picture intent method.
        public void takePictureIntent(){
            Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if(takePicture.resolveActivity(getPackageManager()) != null) {
                startActivityForResult(takePicture, REQUEST_IMAGE_CAPTURE);
            }
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode== RESULT_OK) {
                Bundle extras = data.getExtras();
                thumbnailImage = (Bitmap) extras.get("data");
            }
        } 
    }
    

    故事活动

    package com.example.samue.interactivefamilystory.main.ui;
    
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.drawable.Drawable;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import com.example.samue.interactivefamilystory.R;
    import com.example.samue.interactivefamilystory.main.model.Choice;
    import com.example.samue.interactivefamilystory.main.model.Page;
    import com.example.samue.interactivefamilystory.main.model.Story;
    
    
    public class StoryActivity extends AppCompatActivity {
    
        private String name;
        private Bitmap usersPicture = null;
    
        private Story story;
        private ImageView storyImageView;
        private TextView storyTextView;
        private Button choice1button;
        private Button choice2button;
    
        public static final String TAG = StoryActivity.class.getSimpleName();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_story);
    
            storyImageView = (ImageView) findViewById(R.id.story_image_view);
            storyTextView = (TextView) findViewById(R.id.story_text_view);
            choice1button = (Button) findViewById(R.id.next_page_button1);
            choice2button = (Button) findViewById(R.id.next_page_button2);
    
    
    
            Intent intent = getIntent();
            name = intent.getStringExtra("name");
            if (name == null || name.isEmpty()){
                name = "Baby";
            }
            Log.d(TAG,name);
    
            usersPicture = intent.getExtras().getParcelable("picture");
    
            story = new Story();
            loadPage(0);
    
    
        }
    
        private void loadPage(int pageNumber) {
            final Page page = story.getPage(pageNumber);
            Drawable image = ContextCompat.getDrawable(this, page.getImageID());
            storyImageView.setImageDrawable(image);
    
            //get string from page then set the format special characters to name taken from edit text.
            String pageText = getString(page.getTextID());
            pageText = String.format(pageText, name);
            storyTextView.setText(pageText);
    
    
            if (page.isFinalPage()){
                if(usersPicture == null){
                storyImageView.setImageResource(R.drawable.baby);
                } else {
    
                    storyImageView.setImageBitmap(usersPicture);
                }
                choice1button.setVisibility(View.INVISIBLE);
                choice2button.setText("I see...");
    
            }else {
    
                loadButtons(page);
            }
    
        }
    
        private void loadButtons(final Page page) {
            String buttonText = getString(page.getChoice1().getmTextID());
            buttonText = String.format(buttonText,name);
            choice1button.setText(buttonText);
            choice1button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    int nextPage = page.getChoice1().getmNextPage();
                    loadPage(nextPage);
                }
            });
            String buttonText2 = getString(page.getChoice2().getmTextID());
            buttonText2 = String.format(buttonText2, name);
            choice2button.setText(buttonText2);
            choice2button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    int nextPage = page.getChoice2().getmNextPage();
                    loadPage(nextPage);
                }
    
            });
        }
    }
    

    希望有帮助的更多信息。

    嗯。。让我从头开始,我正在尝试实现一个功能,如果有人拍照,它会用他们的图片替换最后一页src图像上的图片。 据我所知,这句话应该能说明问题,但事实并非如此

    if (page.isFinalPage()){
        if(usersPicture == null){
        storyImageView.setImageResource(R.drawable.baby);
        } else {
    
            storyImageView.setImageBitmap(usersPicture);
        }
        choice1button.setVisibility(View.INVISIBLE);
        choice2button.setText("I see...");
    

    我的页面类

    package com.example.samue.interactivefamilystory.main.model;
    
    import android.widget.Button;
    
    /**
     * Created by samue on 3/22/2018.
     */
    
    public class Page {
    
        private int imageID;
        private int textID;
    
        private Choice choice1;
        private Choice choice2;
    
        private boolean isFinalPage = false;
    
    
        public Page(int imageID, int textID, Choice choice1, Choice choice2){
    
            this.imageID = imageID;
            this.textID = textID;
            this.choice1 = choice1;
            this.choice2 = choice2;
    
        }
    
        public Page(int imageID, int textID){
            this.imageID = imageID;
            this.textID = textID;
            isFinalPage = true;
        }
    
        public Page(int textID){
            this.textID = textID;
            isFinalPage = true;
        }
    
    
        public boolean isFinalPage() {
            return isFinalPage;
        }
    
        public void setFinalPage(boolean finalPage){
            isFinalPage = finalPage;
        }
    
        public int getImageID() {
            return imageID;
        }
    
        public void setImageID(int imageID) {
            this.imageID = imageID;
        }
    
        public int getTextID() {
            return textID;
        }
    
        public void setTextID(int textID) {
            this.textID = textID;
        }
    
        public Choice getChoice1() {
            return choice1;
        }
    
        public void setChoice1(Choice choice1) {
            this.choice1 = choice1;
        }
    
        public Choice getChoice2() {
            return choice2;
        }
    
        public void setChoice2(Choice choice2) {
            this.choice2 = choice2;
        }
    }
    

    和给我带来麻烦的页面

     pages[6] = new Page(R.drawable.baby, R.string.player);
    

    我希望这能为我所说的话提供更多的背景,对所有的信息表示抱歉

    2 回复  |  直到 7 年前
        1
  •  0
  •   Skizo-ozᴉʞS ツ    7 年前

    我有一个和你一样的问题,如果我没有错的话,你在获取 Drawable 所以,你最好遵循以下步骤:

     public int getId(String resourceName, Class<?> c) {
            try {
                Field idField = c.getDeclaredField(resourceName);
                return idField.getInt(idField);
            } catch (Exception e) {
                throw new RuntimeException("No resource ID found for: "
                        + resourceName + " / " + c, e);
            }
        }
    

    此方法将返回给您 id 因此,您对该方法的调用应该是:

    Drawable image = ContextCompat.getDrawable(this, getId(page.getImageID(),R.drawable.class));
    

    它将返回您的 可抽出式 ,如果 page.getImageID() 正在返回与您要查找的图像相同的名称,否则它将崩溃。

    例如,如果您有

    R.drawable
       -image1
       -image2
    

    还有你的 页getImageID() 正在返回给您: image1 ,它将起作用。

    编辑

    制作照片,然后将其显示或保存到 Bitmap 您应该执行以下简单步骤:

    单击TakePictureContent()时,必须创建 Intent

    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
                    startActivityForResult(cameraIntent, CAMERA_REQUEST); 
    

    然后将其存储在 onActivityResult() 您必须这样做:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
            if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {  
                thumbnailImage = (Bitmap) data.getExtras().get("data"); 
    
            }  
        } 
    
        2
  •  0
  •   DataDino    7 年前

    您正在检查回调中同一字段的两个值:

     if (requestCode == REQUEST_IMAGE_CAPTURE && requestCode == RESULT_OK)
    

    您需要检查RESULT\u OK的resultCode,而不是requestCode:

     if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK)
    

    更新时间:

    好的,那么您的错误是:

    android.content.res.Resources$NotFoundException: Resource ID #0x0
    

    说找不到这个:

    Drawable image = ContextCompat.getDrawable(this, page.getImageID());
    

    所以我会打印出哪一页。getImageID()正在返回。它必须返回要加载的drawable的Android R文件资源id。