Android混淆使用相机在应用程序中拍照并发送额外的Intent

时间:2018-03-25 23:55:55

标签: java android android-intent android-camera-intent

我正在尝试实现一项功能,如果有人拍照,它会替换最终页面源图像上的图片。我的演示程序工作正常,但我遇到了我想要实现该功能的实际程序的问题。我正在学习本教程。我相信我的实际课程和构造者开始变得更复杂,然后我现在才明白。 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");
        }
    } 
}

StoryActivity

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 个答案:

答案 0 :(得分:0)

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

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

您需要检查RESULT_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());

所以我打印出了page.getImageID()返回的内容。它必须返回您要加载的drawable的Android R文件资源ID。

答案 1 :(得分:0)

我遇到了类似于你的问题,如果我没有错,你很难得到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));

它将返回Drawable的ID,如果page.getImageID()返回的是与您要查找的图片相同的名称,它将起作用,否则会崩溃。

例如,如果你有

R.drawable
   -image1
   -image2

你的page.getImageID()正在回复你:image1,它会有效。

修改

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

当您点击takePictureIntent()时,您必须创建此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"); 

        }  
    }