2012-06-23 2 views
0

У меня есть приложение на основе табуляции. Есть три вкладки. Одна из вкладок используется для камеры. Поэтому, когда я нажимаю вкладку камеры, она открывает активность камеры, чтобы я мог делать снимки. Пока здесь не работает. Когда я делаю снимок, это изображение отображается в ImageView. Здесь, когда я нажимаю любую другую вкладку, а затем нажимаю вкладку камеры, активность камеры не запускается. Продолжение показывает, что предыдущее изображение на ImageView. Я хочу, чтобы всякий раз, когда пользователь нажимает на вкладку камеры, он должен открывать активность камеры. Как я могу достичь этого эффекта?Активность камеры не начинается во второй раз

Вот мой код. Ниже os oncreate метод, который находится в активности камеры. Поэтому, когда нажата вкладка камеры, она открывает эту активность.

protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.camera); 

    userFunctions = new UserFunctions(); 
    globalUID = getIntent().getExtras().getString("globalUID"); 
    Toast.makeText(getApplicationContext(), globalUID, Toast.LENGTH_LONG).show(); 
    ivUserImage = (ImageView)findViewById(R.id.ivUserImage); 
    bUpload = (Button)findViewById(R.id.bUpload); 
    openCamera(); 
} 

private void openCamera() { 
    i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(i, CameraResult); 
} 

Update

Я сделал это, но все та же проблема

boolean flag = true; 
@Override 
protected void onResume() { 
    super.onResume(); 
    //flag = true; 
    if(flag) { 
     openCamera(); 
     flag = false; 
    } 
} 

Редактировать

Выполнив Имран Ответим мой код выглядит, как это сейчас. Я также добавляю дополнительный код. Но этот код по-прежнему не работает.

public class Camera extends Activity { 
    ImageView ivUserImage; 
    Button bUpload; 
    Intent i; 
    int CameraResult = 0; 
    Bitmap bmp; 
    public String globalUID; 
    UserFunctions userFunctions; 
    String photoName; 
    InputStream is; 
    String largeImagePath; 
    int serverResponseCode = 0; 
    public static boolean flag = true; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.camera); 

     userFunctions = new UserFunctions(); 
     globalUID = getIntent().getExtras().getString("globalUID"); 
     //flag = getIntent().getExtras().getBoolean("flag"); 
     Toast.makeText(getApplicationContext(), globalUID, Toast.LENGTH_LONG).show(); 
     ivUserImage = (ImageView)findViewById(R.id.ivUserImage); 
     bUpload = (Button)findViewById(R.id.bUpload); 
     //openCamera(); 
     if(flag ==true) 
      openCamera(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     if(flag==true) 
      openCamera(); 
    } 

    private void openCamera() { 
     i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(i, CameraResult); 
    } 

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

     super.onActivityResult(requestCode, resultCode, data); 
     flag = false; 
     if(resultCode == RESULT_OK) { 

      //set image taken from camera on ImageView 
      Bundle extras = data.getExtras(); 
      bmp = (Bitmap) extras.get("data"); 
      ivUserImage.setImageBitmap(bmp); 

      //Create new Cursor to obtain the file Path for the large image 
      String[] largeFileProjection = { 
       MediaStore.Images.ImageColumns._ID, 
       MediaStore.Images.ImageColumns.DATA 
      }; 

      String largeFileSort = MediaStore.Images.ImageColumns._ID + " DESC"; 
      Cursor myCursor = this.managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, largeFileProjection, null, null, largeFileSort); 

      try { 
       myCursor.moveToFirst(); 
       //This will actually give you the file path location of the image. 
       largeImagePath = myCursor.getString(myCursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATA)); 

       File f = new File("" + largeImagePath); 

       photoName = f.getName(); 

       bUpload.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View v) { 
         new Upload().execute(largeImagePath, globalUID, photoName); 
        } 

       }); 

      } finally { 
       myCursor.close(); 
      } 
     } 
    } 
} 

Вот моя вкладка Код активности

public class DashboardActivity extends TabActivity { 
    UserFunctions userFunctions; 
    public String globalUID; 
    DatabaseHandler db; 
    boolean flag = true; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.dashboard); 

     db = new DatabaseHandler(getApplicationContext()); 
     // Check login status in database 
     userFunctions = new UserFunctions(); 

     if(userFunctions.isUserLoggedIn(getApplicationContext())){ 
      //globalUID = getIntent().getExtras().getString("globalUID"); 
      HashMap<String, String> data = db.getUserDetails(); 
      globalUID = data.get("uid"); 
      Resources res = getResources(); // Resource object to get Drawables 
      TabHost tabHost = getTabHost(); // The activity TabHost 
      TabHost.TabSpec spec; // Resusable TabSpec for each tab 
      Intent intent; // Reusable Intent for each tab 

      //Home 
      intent = new Intent(this, Home.class); 
      intent.putExtra("globalUID", globalUID); 
      spec = tabHost.newTabSpec("home").setIndicator("", res.getDrawable(R.drawable.home_icon)).setContent(intent); 
      tabHost.addTab(spec); 

      //Camera 
      intent = new Intent(this, Camera.class); 
      intent.putExtra("globalUID", globalUID); 
      //intent.putExtra("flag", flag); 
      spec = tabHost.newTabSpec("camera").setIndicator("", res.getDrawable(R.drawable.camera_icon)).setContent(intent); 
      tabHost.addTab(spec); 

      //Albums 
      intent = new Intent(this, Albums.class); 
      intent.putExtra("globalUID", globalUID); 
      spec = tabHost.newTabSpec("albums").setIndicator("", res.getDrawable(R.drawable.albums_icon)).setContent(intent); 
      tabHost.addTab(spec); 

      //tabHost.setCurrentTab(1); 
     } else { 
      // user is not logged in show login screen 
      Intent login = new Intent(getApplicationContext(), LoginActivity.class); 
      login.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      startActivity(login); 
      // Closing dashboard screen 
      finish(); 
     } 
    } 
} 

Вот вся моя деятельность камеры

public class Camera extends Activity { 
    ImageView ivUserImage; 
    Button bUpload; 
    Intent i; 
    int CameraResult = 0; 
    Bitmap bmp; 
    public String globalUID; 
    UserFunctions userFunctions; 
    String photoName; 
    InputStream is; 
    String largeImagePath; 
    int serverResponseCode = 0; 
    public static boolean flag = true; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.camera); 

     userFunctions = new UserFunctions(); 
     globalUID = getIntent().getExtras().getString("globalUID"); 
     //flag = getIntent().getExtras().getBoolean("flag"); 
     Toast.makeText(getApplicationContext(), globalUID, Toast.LENGTH_LONG).show(); 
     ivUserImage = (ImageView)findViewById(R.id.ivUserImage); 
     bUpload = (Button)findViewById(R.id.bUpload); 
     //openCamera(); 
     //if(flag ==true) 
      openCamera(); 
    } 
    /* 
    @Override 
    protected void onResume() { 
     super.onResume(); 
     if(flag==true) 
      openCamera(); 
    }*/ 

    private void openCamera() { 
     i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(i, CameraResult); 
    } 

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

     super.onActivityResult(requestCode, resultCode, data); 
     flag = false; 
     if(resultCode == RESULT_OK) { 

      //set image taken from camera on ImageView 
      Bundle extras = data.getExtras(); 
      bmp = (Bitmap) extras.get("data"); 
      ivUserImage.setImageBitmap(bmp); 

      //Create new Cursor to obtain the file Path for the large image 
      String[] largeFileProjection = { 
        MediaStore.Images.ImageColumns._ID, 
        MediaStore.Images.ImageColumns.DATA 
      }; 

      String largeFileSort = MediaStore.Images.ImageColumns._ID + " DESC"; 
      Cursor myCursor = this.managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, largeFileProjection, null, null, largeFileSort); 

      try { 
       myCursor.moveToFirst(); 
       //This will actually give you the file path location of the image. 
       largeImagePath = myCursor.getString(myCursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATA)); 

       File f = new File("" + largeImagePath); 

       photoName = f.getName(); 

       bUpload.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View v) { 
         new Upload().execute(largeImagePath, globalUID, photoName); 
        } 

       }); 

      } finally { 
       myCursor.close(); 
      } 
     } 
    } 

    public class Upload extends AsyncTask<String, Integer, String> { 

     ProgressDialog dialog; 

     protected void onPreExecute() { 
      dialog = ProgressDialog.show(Camera.this, "", "Uploading file...", true); 
     } 

     @Override 
     protected String doInBackground(String... arg0) { 
      // TODO Auto-generated method stub 
      String success = "false"; 
      Bitmap bitmapOrg = setImageToImageView(largeImagePath);//BitmapFactory.decodeFile(largeImagePath); 
      ByteArrayOutputStream bao = new ByteArrayOutputStream(); 
      bitmapOrg.compress(Bitmap.CompressFormat.JPEG, 90, bao); 

      byte [] ba = bao.toByteArray(); 
      String ba1=Base64.encodeToString(ba, 0); 

      ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
      nameValuePairs.add(new BasicNameValuePair("image",ba1)); 
      nameValuePairs.add(new BasicNameValuePair("imageName", photoName)); 
      nameValuePairs.add(new BasicNameValuePair("uid", globalUID)); 

      try { 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost("http://www.example.info/android/fileupload.php"); 
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
       if(response != null) { 
        success = "true"; 
       } 
       is = entity.getContent(); 
      } catch(Exception e) { 
       Log.e("log_tag", "Error in http connection "+e.toString()); 
      } 
      dialog.dismiss(); 
      return success; 
     } 

     protected void onProgressUpdate(Integer...progress) { 

     } 

     protected void onPostExecute(String f) { 
      Toast.makeText(getApplicationContext(), "File uploaded", Toast.LENGTH_LONG).show(); 
     } 

    } 

    public Bitmap setImageToImageView(String filePath) { 
     // Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeFile(filePath, o); 

     // The new size we want to scale to 
     final int REQUIRED_SIZE = 1024; 

     // Find the correct scale value. It should be the power of 2. 
     int width_tmp = o.outWidth, height_tmp = o.outHeight; 
     int scale = 1; 
     while (true) { 
      if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE) 
      break; 
      width_tmp /= 2; 
      height_tmp /= 2; 
      scale *= 2; 
     } 

     // Decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 
     Bitmap bitmap = BitmapFactory.decodeFile(filePath, o2); 
     return bitmap; 

    } 

    public boolean fileData(String guid, String photoName) { 
     Toast.makeText(getApplicationContext(), photoName, Toast.LENGTH_LONG).show(); 

     JSONObject json = userFunctions.uploadFileData(guid, photoName); 

     try { 
      if(Integer.parseInt(json.getString("success")) != 1) { 
       Toast.makeText(getApplicationContext(), json.getInt("error_msg"), Toast.LENGTH_LONG).show(); 
       //register_error.setText(json.getString("error_msg")); 
       return false; 
      } 
     } catch (NumberFormatException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return true; 
    } 
} 

ответ

0

Это происходит потому, что при переключении между вкладками вашей активности оленьей кожей вызова onCreate снова.

Попробуйте перевести вызов на openCamera(); в метод onResume, и это должно быть хорошо.

protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.camera); 

    userFunctions = new UserFunctions(); 
    globalUID = getIntent().getExtras().getString("globalUID"); 
    Toast.makeText(getApplicationContext(), globalUID, Toast.LENGTH_LONG).show(); 
    ivUserImage = (ImageView)findViewById(R.id.ivUserImage); 
    bUpload = (Button)findViewById(R.id.bUpload); 

} 



protectd void onResume(){ 
     super.onResume(); 
     openCamera(); 
} 

private void openCamera() { 
    i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(i, CameraResult); 
} 
+0

Я поставил openCamera в методе onResume, но теперь я не могу даже видеть то, что берется на ImageView.Фактически, когда я нажимаю кнопку «Сохранить» на операции с камерой, я возвращаюсь к активности камеры, и это продолжается, после пяти или шести снимков. – 2619

0

Каждый Activity В одном из TabHost вызовов onCreate() только один раз причина эффективности. Вот почему openCamera() не вызывается снова и снова.

Чтобы справиться с этим, вы можете в родительском Activity реализовать и зарегистрировать OnTabChangeListener, где вы можете поймать, какая вкладка нажата и выполнить любое действие.

Надеюсь, это поможет!

0

добавить onResume() в свою деятельность и позвонить openCamera(); от onResume() также как:

public static boolean flag = true; 

protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.camera); 

    userFunctions = new UserFunctions(); 
    globalUID = getIntent().getExtras().getString("globalUID"); 
    Toast.makeText(getApplicationContext(), globalUID, Toast.LENGTH_LONG).show(); 
    ivUserImage = (ImageView)findViewById(R.id.ivUserImage); 
    bUpload = (Button)findViewById(R.id.bUpload); 
if(flag ==true) 
    openCamera(); 
} 


     @Override 
     protected void onResume() { 
      super.onResume(); 
if(flag==true) 
      openCamera(); 
     } 

и на onActivityResut()

flag =false; 

или tabclick

YourflagActivity.flag=true; 
+0

Я положил openCamera в метод onResume, но теперь я даже не вижу того, что берется в ImageView. Фактически, когда я нажимаю кнопку «Сохранить» на операции с камерой, я возвращаюсь к активности камеры, и это продолжается, после пяти или шести снимков. – 2619

+0

@ al0neevenings: используйте один Boolean для установки условия в onResume, то если действие возобновляется с помощью приложения Camara, тогда не нужно вызывать метод openCamera, или если активность возобновляется нажатием на вкладку, тогда вызовите openCamera.i подумайте, что вы понимаете, что я хочу сказать –

+0

Как я узнаю, возобновлена ​​ли деятельность в настоящее время или нет? – 2619

Смежные вопросы