【问题标题】:Two ImageView can not display the images from the camera simultaneously两个 ImageView 不能同时显示来自摄像头的图像
【发布时间】:2014-08-21 05:27:37
【问题描述】:

我是 android 新手,现在我仍在构建一个包含两个活动的应用程序,首先是 LoginPage,它运行良好,第二个是 UserPage,问题从这里开始。我在 UserPage 上创建了两个 ImageView,我想要的是

  1. 点击ImageView
  2. 从相机拍照
  3. 将其保存到选定的 ImageView

当我单击第一个 ImageView 并从相机保存图片时效果很好,当我单击第二个 imageview 时问题开始,当我拍照并将其保存到第二个 imageview 时,第一个 imageview 中的图片消失了

这是我的代码: 用户.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >


<ImageView
    android:id="@+id/image1"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:scaleType="centerInside" />


<ImageView
    android:id="@+id/image2"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_toRightOf="@id/image1"
    android:layout_alignTop="@id/image1"
    android:scaleType="centerInside" />

</RelativeLayout>

UserPage.java

public class UserPage extends Activity {


ImageView imageView1, imageView2;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.user);

    imageView1 = (ImageView)findViewById(R.id.image1);
    imageView1.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v) { 
            // TODO Auto-generated method stub
            Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(i, 1);               
        }
    });
    imageView2 = (ImageView)findViewById(R.id.image2);
    imageView2.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v) { 
            // TODO Auto-generated method stub
            Intent ii = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(ii, 2);                  
        }
    });

}//OnCreate

@Override
protected void onActivityResult(int requestCode,
    int resultCode, Intent data) {
    Bitmap userImage = (Bitmap)data.getExtras().get("data");
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode){
    case 1:
       if(resultCode == RESULT_OK){

          Bundle extras = data.getExtras();
          userImage = (Bitmap) extras.get("data");
          imageView1.setImageBitmap(userImage);
       }//if resultCode Case 1
       break;
    case 2:
       if(resultCode == RESULT_OK) {

            Bundle extras = data.getExtras();
            userImage = (Bitmap) extras.get("data");
            imageView2.setImageBitmap(userImage);

        }//if resultCode Case 2

      }//Switch 

   }//onActivityResult  
}//UserPage

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.pramana.report"
android:versionCode="2"
android:versionName="1.1" >

<uses-sdk
    android:minSdkVersion="8"        
    />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.camera"></uses-feature> 

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name="com.pramana.report.UserPage"></activity>
</application>

</manifest>

请帮助,我已经搜索并尝试了一些建议,例如 Take multiple images with camera and insert into multiple diffefent imageViews 但它没有工作

对不起,我的英语不好,我的英语不太好

【问题讨论】:

  • 它也不起作用,当我将图像保存到 ImageView2 时,ImageView1 仍然丢失图像也许你可以举个例子,以防我错过你的意思

标签: android image android-intent camera imageview


【解决方案1】:

试试它的工作原理:

全局声明

ImageView iv1 ,iv2;
private static Bitmap userImage1,userImage2;

Imageview 的点击监听器

iv1.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(i, 1);    
        }
    });

    iv2.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(i, 2);    
        }
    });

onActivityResult 代码

    @Override
protected void onActivityResult(int requestCode,
    int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode){
    case 1:
       if(resultCode == RESULT_OK){
           userImage1 = (Bitmap)data.getExtras().get("data");
          Bundle extras = data.getExtras();
          userImage1 = (Bitmap) extras.get("data");
          iv1.setImageBitmap(userImage1);
       }//if resultCode Case 1
       break;
    case 2:
       if(resultCode == RESULT_OK) {
           userImage2 = (Bitmap)data.getExtras().get("data");
            Bundle extras = data.getExtras();
            userImage2 = (Bitmap) extras.get("data");
            iv2.setImageBitmap(userImage2);

        }//if resultCode Case 2

      }//Switch 

   }//onActivityResult 

【讨论】:

  • 它不起作用,我创建了 userImage1 和 userImage2 然后替换了我的 userImage 但是当我在 ImageView2 中设置 Image 时 ImageView1 中的静止图像消失了,还有其他建议吗?
  • 尝试将你的两个位图对象声明为 sherin 所指向的静态
  • 也没用,还有什么建议吗?
  • 看看我的ans,我已经用我身边的工作代码更新了它。
  • 呃,还是和以前一样
【解决方案2】:

试试这个:

私有静态位图 sImageView1 =null;

私有静态位图 sImageView2 =null;

私有静态 Uri image_uri;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

      SavedInstanceState mSavedInstanceState = savedInstanceState;

    if (mSavedInstanceState==null){
        sImageView1=null;
        sImageView2=null;
    }


            imageView1.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View v) { 

                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    Uri fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
                    image_uri = fileUri;
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
                    startActivityForResult(intent, 1);       
               }
            });

        }

@Override
public void onStart() {
    super.onStart();

    if (sImageView1 !=null) {
        imageView1.setImageBitmap(userImage);
    } 
    if (sImageView2 !=null) {
        imageView2.setImageBitmap(userImage);
    } 


}

        @Override
        protected void onActivityResult(int requestCode,int resultCode, Intent data) {

        //UPDATE THIS CODE
            switch(requestCode){
             case 1:
                if(resultCode == RESULT_OK){


                    sImageView1=decodeScaledBitmapFromSdCard(image_uri.getPath(), 200, 200);

//SAVE YOUR IMAGE IN A SHARED PREFERENCES OR IN ANY LOCAL DATABASE
                    RotateBitmap(sImageView1, 0);

                    //imageView1.setImageBitmap(sImageView1);  

                }//if resultCode Case 1
            break;


            }//Switch 
        }



public Bitmap RotateBitmap(Bitmap source, float angle) {
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);

    sImageView1 = source;
    sImageView1 = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);

    imageView1.setImageBitmap(sImageView1);
    imageView1.setAdjustViewBounds(true);


    return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
}

【讨论】:

  • 我尝试像您一样进行编辑,但是当我尝试单击 ImageView1 时应用程序停止,还有其他建议吗?
  • @Pramana 那是什么错误。首先你更新你的 imageview1
  • 致命异常:主要,java.lang.NullPointerException:文件
  • 我意识到即使我没有拍摄图像,imageView1 也消失了,我的意思是当我单击 ImageView2 并且当相机出现时,我按下返回按钮,ImageView1 中的图像消失了,创建新 Intent 时会出现问题吗?
  • @Pramana 好的。然后我认为您没有保存您的第一张捕获的图像。您需要保存您首先拍摄的图像,因为当您尝试拍摄下一张图像而不保存上一张图像时,您的活动将重新启动,因此它只会像新的一样工作。
【解决方案3】:

感谢 Sherin 和 Yograj Shinde,解决方案是我必须先保存活动,然后再开始新活动。这是我的代码:

UserPage.Java

public class UserPage extends Activity {

ImageView iv1 ,iv2;
private static Bitmap userImage1,userImage2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.user);

    if(savedInstanceState != null)
    {
        userImage1 = savedInstanceState.getParcelable("userImage1");
    }

    iv1 = (ImageView)findViewById(R.id.image1);
    iv2 = (ImageView)findViewById(R.id.image2);

    iv1.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(i, 1);    
        }
    });

    iv2.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(i, 2);    
        }
    });
}

@Override
public void onStart() {
    super.onStart();
    if(userImage1 != null)
    {
        iv1.setImageBitmap(userImage1);
    }
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState){
   super.onSaveInstanceState(savedInstanceState);
   savedInstanceState.putParcelable("userImage1", userImage1);
}


@Override
protected void onActivityResult(int requestCode,
    int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode){
    case 1:
       if(resultCode == RESULT_OK){
          userImage1 = (Bitmap)data.getExtras().get("data");
          Bundle extras = data.getExtras();
          userImage1 = (Bitmap) extras.get("data");
          iv1.setImageBitmap(userImage1);
       }//if resultCode Case 1
       break;
    case 2:
       if(resultCode == RESULT_OK) {
           userImage2 = (Bitmap)data.getExtras().get("data");
            Bundle extras = data.getExtras();
            userImage2 = (Bitmap) extras.get("data");
            iv2.setImageBitmap(userImage2);

        }//if resultCode Case 2

      }//Switch 

   }//onActivityResult 


}//Class UserPage

这里的想法是,当开始一个新活动时,您必须保存上一个活动以防止丢失。这就是我使用

的原因
@Override
public void onSaveInstanceState(Bundle savedInstanceState){
   super.onSaveInstanceState(savedInstanceState);
   savedInstanceState.putParcelable("userImage1", userImage1);
}

在启动新activity之前保存数据,并在新activity启动时使用onStart()设置ImageView 本文将帮助您理解:

http://developer.android.com/reference/android/app/Activity.html
How to use onSavedInstanceState example please

注意: 该程序仍然需要很多改进,因为它还没有完成,但我希望它可以帮助其他人

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    相关资源
    最近更新 更多