2015-02-15 3 views
0

У меня есть два вида деятельности, TakePictureActivity и ChoosePicActivity, и оба они приводят к PuzzleActivity.Два конфликта onActivityResult android

Как вы можете видеть, 1-я активность начинает замысел запуска камеры, позволяет делать снимок и запускать PuzzleActivity.

2-я активность, доступ к галерее, позволяет вам выбрать изображение и начать PuzzleActivity.

В PuzzleActivity вызывается метод createScaledBitmap для генерации растрового изображения.

Вот TakePictureActivity:

public class TakePictureActivity extends Activity { 

String mCurrentPhotoPath; 
static final int REQUEST_TAKE_PHOTO = 1; 
public static final int DIALOG_PICASA_ERROR_ID = 0; 
private static String DEBUG_TAG1 = "TakePictureA"; 
private Bitmap bitmap; 
public static Uri imageUri; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    setContentView(R.layout.takepicture); 
    dispatchTakePictureIntent(); 
} 
//TODO createImageFile 
    /* (non-Javadoc) 
    * Creates a file for the picture with a collision-resistant name using date-time stamp. 
    * Additionally, it saves the path to the picture in a member variable, mCurrentPhotoPath. 
    */ 
    private File createImageFile() throws IOException { 
     // Create an image file name 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date(0)); 
     String imageFileName = "JPEG_" + timeStamp + "_"; 
     File storageDir = Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_PICTURES); 
     File image = File.createTempFile(
      imageFileName, /* prefix */ 
      ".jpg",   /* suffix */ 
      storageDir  /* directory */ 
     ); 

     // Save a file: path for use with ACTION_VIEW intents 
     mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
     Log.d(DEBUG_TAG1,"Current photo Path" + mCurrentPhotoPath); 
     galleryAddPic(); 
     return image; 
    } 
//TODO dispatchTakePictureIntent 
    /* (non-Javadoc) 
    * Starts an intent for the camera application. 
    */ 
    private void dispatchTakePictureIntent() { 
     Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     // Ensure that there's a camera activity to handle the intent 
     if (i.resolveActivity(getPackageManager()) != null) { 
      // Create the File where the photo should go 
      File photoFile = null; 
      try { 
       Log.d(DEBUG_TAG1,"try create iamge file"); 
       photoFile = createImageFile(); 
      } catch (IOException ex) { 
       // Error occurred while creating the File 
       Log.d(DEBUG_TAG1,"error"); 
      } 
      // Continue only if the File was successfully created 
      if (photoFile != null) { 
       Log.d(DEBUG_TAG1,"photo file not null"); 
       i.putExtra(MediaStore.EXTRA_OUTPUT, 
         Uri.fromFile(photoFile)); 
       startActivityForResult(i, REQUEST_TAKE_PHOTO); 
      } 
     } 
    } 
    private void galleryAddPic() { 
     Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
     File f = new File(mCurrentPhotoPath); 
     Uri contentUri = Uri.fromFile(f); 
     mediaScanIntent.setData(contentUri); 
     this.sendBroadcast(mediaScanIntent); 
    } 

    @Override 
    protected final void onActivityResult(final int requestCode, final int resultCode, final Intent i) { 
     //super.onActivityResult(requestCode, resultCode, i); 

     if (resultCode == RESULT_OK) { 
      Log.d(DEBUG_TAG1,"TakePicture onActivityResult "); 
     switch (requestCode) { 

     case REQUEST_TAKE_PHOTO: 
      imageUri = i.getData(); 
      Log.d(DEBUG_TAG1,"intent take pic: " + i); 
      Intent i1 = new Intent(this, PuzzleActivity.class); 
      startActivity(i1); 
      break; 
     } // end switch 
     } // end if 
    } 
} 

А вот ChoosePicActivity:

public class ChoosePicActivity extends Activity { 

String mCurrentPhotoPath; 
public static final int IMAGEREQUESTCODE = 8242008; 
static final int REQUEST_TAKE_PHOTO = 1; 
public static final int DIALOG_PICASA_ERROR_ID = 0; 
private static String DEBUG_TAG1 = "ChoosePicA"; 
private Bitmap bitmap; 
public static Uri imageUri; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    selectImageFromGallery(); 
} 


/* (non-Javadoc) 
    * Will start an intent for external Gallery app. 
    * Image returned via onActivityResult(). 
    */ 
private void selectImageFromGallery() { 
     Intent galleryIntent = new Intent(Intent.ACTION_PICK, 
      MediaStore.Images.Media.INTERNAL_CONTENT_URI); 
     startActivityForResult(galleryIntent, IMAGEREQUESTCODE); 
    } 
//TODO onActivityResult 
    /* (non-Javadoc) 
    * Run when Gallery app returns selected image. 
    */ 
@Override 
    protected final void onActivityResult(final int requestCode, final int resultCode, final Intent i) { 
     //super.onActivityResult(requestCode, resultCode, i); 
     if (resultCode == RESULT_OK) { 
      Log.d(DEBUG_TAG1,"ChoosePic onActivityResult "); 
     switch (requestCode) { 
     case IMAGEREQUESTCODE: 
      imageUri = i.getData(); 
      Log.d(DEBUG_TAG1,"intent choose pic: " + i); 
      Intent i1 = new Intent(this, PuzzleActivity.class); 
      startActivity(i1); 
      break; 
     } // end switch 
     } // end if 
    } 

} 

А вот PuzzleActivity:

public final class PuzzleActivity extends Activity implements OnClickListener{ 
private Bitmap bitmap; // temporary holder for puzzle picture 
public static Chronometer chrono; 
static TextView tv1; 
static EditText et1; 
Button button; 
private static Context mContext; 



//TODO onCreate 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
setContentView(R.layout.board); 
    mContext = this; 
    tv1 = (TextView) findViewById(R.id.movecount_display); 

    if(DecidePicActivity.choosepic){ 
     try { 
      bitmap = createScaledBitmap(ChoosePicActivity.imageUri); 
     } catch (FileNotFoundException e) { 
      showDialog(DIALOG_PICASA_ERROR_ID); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      finish(); 
     } catch (IllegalArgumentException e) { 
      showDialog(DIALOG_PICASA_ERROR_ID); 
     } 

     createGameBoard(getGridSize()); 
    } 
    else if(DecidePicActivity.takepic){ 
     try { 
      bitmap = createScaledBitmap(TakePictureActivity.imageUri); 
     } catch (FileNotFoundException e) { 
      showDialog(DIALOG_PICASA_ERROR_ID); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      finish(); 
     } catch (IllegalArgumentException e) { 
      showDialog(DIALOG_PICASA_ERROR_ID); 
     } 

     createGameBoard(getGridSize()); 
    } 

    TileView.moveDetector = new GestureDetectorCompat(this, new MyGestureListener()); 
    Button pauseButton = (Button) findViewById(R.id.pause_button); 
    pauseButton.setOnClickListener(this); 

}

ISSU e is:

Я добираюсь до ChoosePicActivity, я выбираю фото из галереи, начинаю собираться до PuzzleActivity и создает масштабированное растровое изображение с выбранным изображением. Все хорошо, пока здесь.

тогда PuzzleActivity получает законченный и я добраться до TakePictureActivity, начинается камера, я взять рис, начать намерение идти PuzzleActivity, а затем масштабируется растровый генерироваться использует образ ранее выбранного в ChoosePicActivity, оставив недавно сфотографировались позади, который является картиной, которую он должен был использовать для создания масштабированного растрового изображения.

С другой стороны, если начато TakePictureActivity без ChoosePicActivity, то принятое изображение используется для генерации масштабированного растрового изображения, как и ожидалось.

Надеюсь, я объяснил, что достаточно хорошо для вас, чтобы понять мою проблему. Может кто-нибудь дать немного света?

Я не уверен, если они имеют в 2 раза метод onActivityResult является правильным, или если существует разные темы конфликтуют, или, возможно, метод i.getdata() испытывает трудность, чтобы получить надлежащие Intent идентификатора ... Я немного потеряли ,

ответ

0

Проблема была вызвана DecidePicActivity.choosepic и DecidePicActivity.takepic.

Ранее DecidePicActivity деятельность было так:

public class DecidePicActivity extends Activity implements OnClickListener{ 
static boolean takepic = false; 
static boolean choosepic = false; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    setContentView(R.layout.decidepic); 
    findViewById(R.id.take_pic_button).setOnClickListener(this); 
    findViewById(R.id.choose_pic_button).setOnClickListener(this); 
} 
@Override 
public void onClick(View v) { 
    switch(v.getId()) { 
     case R.id.take_pic_button: 
      takepic = true; 
      Intent i1 = new Intent(this, TakePictureActivity.class); 
      startActivity(i1); 
      break; 
     case R.id.choose_pic_button: 
      choosepic = true; 
      Intent i2 = new Intent(this, ChoosePicActivity.class); 
      startActivity(i2); 
      break; 
    } 
} 

}

takepic и choosepic они не были должным образом инициализируется.

Теперь onClick в DecidePicActivity деятельности, как это:

@Override 
public void onClick(View v) { 
    switch(v.getId()) { 
     case R.id.take_pic_button: 
      takepic = true; 
      choosepic = false; 
      Intent i1 = new Intent(this, TakePictureActivity.class); 
      startActivity(i1); 
      break; 
     case R.id.choose_pic_button: 
      choosepic = true; 
      takepic = false; 
      Intent i2 = new Intent(this, ChoosePicActivity.class); 
      startActivity(i2); 
      break; 
    } 
} 

и проблема решена!

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