Как передать Uri изображения, кликнувшего в пользовательской галерее, другому действию? - PullRequest
0 голосов
/ 04 февраля 2012

Это держит меня без сна ... Я создаю приложение в виде слайд-шоу. Допустим, имя пакета com.myapp.slideshow Пользователь может создать новое слайд-шоу, заполненное изображениями, ранее сохраненными в личной папке приложения на SD-карте (что-то вроде root / Android / data / com.myapp.slideshow / files / immagini /)

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

Итак, подведем итоги. У меня есть SlideshowEditor.java, где пользователь нажимает кнопку для доступа к IMGALLERYactivity.java, где он может щелкнуть изображение из слайд-объекта галереи и якобы вернуться обратно в SlideshowEditor.java с выбранным изображением Uri.

Проблема с моим кодом заключается в том, что когда я запускаю приложение (я тестирую прямо на устройстве с помощью Eclipse), мне кажется, что я не возвращаю Uri и не получаю исключение nullpointer, которое останавливает приложение.

Вот код, который я использую:

SlideshowEditor.java

       // set IDs for each type of media result
   private static final int PICTURE_ID = 1;
   private static final int MUSIC_ID = 2;
   private static final int VIDEO_ID = 3;       
   private static final int TAKE_PICTURE_ID = 4;

   // called when an Activity launched from this Activity returns
   @Override
   protected final void onActivityResult(int requestCode, int resultCode, 
      Intent data)
   {
      if (resultCode == RESULT_OK) // if there was no error
      {
         Uri selectedUri = data.getData(); 

         // if the Activity returns an image
         if (requestCode == PICTURE_ID || 
            requestCode == TAKE_PICTURE_ID || requestCode == VIDEO_ID )
         {
            // determine media type
            MediaItem.MediaType type = (requestCode == VIDEO_ID ?     
               MediaItem.MediaType.VIDEO : MediaItem.MediaType.IMAGE);

            // add new MediaItem to the slideshow
            slideshow.addMediaItem(type, selectedUri.toString());

            // refresh the ListView 
            slideshowEditorAdapter.notifyDataSetChanged();
         } // end if
         else if (requestCode == MUSIC_ID) // Activity returns music
            slideshow.setMusicPath(selectedUri.toString());
      } // end if
   } // end method onActivityResult

   // called when the user touches the "Done" Button
   private OnClickListener doneButtonListener = new OnClickListener()
   {
      // return to the previous Activity
      @Override
      public void onClick(View v)
      {
         finish();
      } // end method onClick
   }; // end OnClickListener doneButtonListener

   // called when the user touches the "Add Picture" Button
   private OnClickListener addPictureButtonListener = new OnClickListener()
   {
      // launch image choosing activity
      @Override
      public void onClick(View v)
      {

         Intent intent = new Intent(SlideshowEditor.this, IMGALLERYactivity.class);
////         String imgfolder = (Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "Android" + File.separator + "data" + File.separator + "com.myapp.slideshow" + File.separator + "files" + File.separator + "immagini" + File.separator).toLowerCase();
       //  Uri startDir = Uri.fromFile(new File("Environment.getExternalStorageDirectory().getAbsolutePath()"));
////         intent.setDataAndType(Uri.parse(imgfolder), "image/*");
         ///intent.setType("image/*");
         ///intent.Output();
         ////startActivity(intent);
         startActivityForResult(intent, PICTURE_ID);
      } // end method onClick
   }; // end OnClickListener addPictureButtonListener

IMGALLERYactivity.java

public class IMGALLERYactivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.imgallery);

   Gallery g = (Gallery) findViewById(R.id.gallery);    g.setAdapter(new ImageAdapter(this, ReadSDCard()));

   g.setOnItemClickListener(new OnItemClickListener() {
       public void onItemClick(AdapterView<?> parent,
         View v, int position, long id) {
           Toast.makeText(IMGALLERYactivity.this, "" + position, Toast.LENGTH_SHORT).show();

           Intent i = new Intent(IMGALLERYactivity.this, SlideshowEditor.class);                 
           i.putExtra("PICTURE_ID", position);                 
           setResult(Activity.RESULT_OK, i);
           finish();           
    //     Intent resultIntent = new Intent(); 
    //     // TODO Add extras or a data URI to this intent as appropriate. 
    //     setResult(Activity.RESULT_OK, resultIntent); 
    //     finish();           

       }    }); }

private List<String> ReadSDCard() { List<String> tFileList = new ArrayList<String>();

//It have to be matched with the directory in SDCard

//File folder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "Android" + File.separator + "data" + File.separator
+ "com.deepsabrina.sabrinadeep" + File.separator + "files" + File.separator + "immagini");

File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "Android" + File.separator + "data" + File.separator
+ "com.deepsabrina.sabrinadeep" + File.separator + "files" + File.separator + "immagini" + File.separator);

File[] files=f.listFiles();

for(int i=0; i<files.length; i++) {  File file = files[i];  /*It's assumed that all file in the path    are in supported type*/  tFileList.add(file.getPath()); }

return tFileList; }

public class ImageAdapter extends BaseAdapter {    int mGalleryItemBackground;    private Context mContext;    private List<String> FileList;

   public ImageAdapter(Context c, List<String> fList) {
       mContext = c;
       FileList = fList;
       TypedArray a = mContext.obtainStyledAttributes(R.styleable.HelloGallery);
       mGalleryItemBackground = a.getResourceId(
       R.styleable.HelloGallery_android_galleryItemBackground,0);
       a.recycle();    }

   public int getCount() {
       return FileList.size();    }

   public Object getItem(int position) {
       return position;    } 

   public long getItemId(int position) {
       return position;    }

   public View getView(int position, View convertView,
     ViewGroup parent) {
       ImageView i = new ImageView(mContext);

       Bitmap bm = BitmapFactory.decodeFile(
         FileList.get(position).toString());
       i.setImageBitmap(bm);

       i.setLayoutParams(new Gallery.LayoutParams(150, 100));
       i.setScaleType(ImageView.ScaleType.FIT_XY);
       i.setBackgroundResource(mGalleryItemBackground);

       return i;    } }

public TypedArray obtainStyledAttributes(int theme) {   // TODO Auto-generated method stub  return null; } }

Что я делаю не так? Любая помощь будет очень признательна, возможно, с исправлениями кода, так как я только начал знакомиться с Android, хотя у меня есть средний уровень знания Java.


EDIT:

Спасибо, Брайан! Я смог получить путь к выбранному элементу на основе позиции, установив get item (), как вы предложили, и затем создав переменную наподобие: String pippo = parent.getItemAtPosition (position) .toString (); По крайней мере, я продвинулся на один шаг вперед ... Однако я все еще не могу передать его в SlideshowEditor.class. Это то, что я поместил в класс IMGALLERYactivity в onitemclicklistener:

public void onItemClick(AdapterView<?> parent,
     View v, int position, long id) {
       String pippo = parent.getItemAtPosition(position).toString();


      Intent data = new Intent(IMGALLERYactivity.this, SlideshowEditor.class);                 
      data.putExtra("PICTURE_ID", pippo);                 
      setResult(RESULT_OK, data);
      finish();            


   } 

На SlideshowEditor.class у меня есть

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

      if (resultCode == RESULT_OK) // if there was no error
      {

          Uri selectedUri = Uri.parse(data.getDataString());         
          //Uri selectedUri = data.getData(); 

         // if the Activity returns an image
         if (requestCode == PICTURE_ID || 
            requestCode == TAKE_PICTURE_ID || requestCode == VIDEO_ID )
         {
            // determine media type
            MediaItem.MediaType type = (requestCode == VIDEO_ID ?     
               MediaItem.MediaType.VIDEO : MediaItem.MediaType.IMAGE);

            // add new MediaItem to the slideshow
            slideshow.addMediaItem(type, selectedUri.toString());

            // refresh the ListView 
            slideshowEditorAdapter.notifyDataSetChanged();
         } // end if
         else if (requestCode == MUSIC_ID) // Activity returns music
            slideshow.setMusicPath(selectedUri.toString());
      } // end if
   } // end method onActivityResult  

Весь процесс запускается с

Intent intent = new Intent(SlideshowEditor.this, IMGALLERYactivity.class);

         startActivityForResult(intent,PICTURE_ID);                                                                                   

Я продолжаю получать nullpointerexception. Я пытался использовать отладку eclipse, и я понимаю, что это nullpointerexception срабатывает при IMGALLERYacctivity, когда я создаю намерение, но я бы не стал ставить на него, потому что отладка eclipse кажется мне очень запутанной ... однако я переключил точку останова на результат onactivity в SlideshowEditor.class, и похоже, что исключение nullpointer снимается до того, как оно достигнет этой точки. Я знаю, что вы не частный консалтинг, но я бьюсь об этом уже 3 дня, и любая помощь действительно поможет мне, прежде чем я сойду с ума. LOL

Это результаты logcat:

02-06 19: 26: 40.080: E / AndroidRuntime (10661): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основное 02-06 19: 26: 40.080: E / AndroidRuntime (10661): java.lang.RuntimeException: ошибка доставки результата ResultInfo {кто = ноль, запрос = 1, результат = -1, данные = намерение { cmp = com.deitel.enhancedslideshow / .SlideshowEditor (имеет дополнительные функции)}} для деятельность {Com.deitel.enhancedslideshow / com.deitel.enhancedslideshow.SlideshowEditor}: java.lang.NullPointerException: uriString 02-06 19: 26: 40.080: E / AndroidRuntime (10661): в android.app.ActivityThread.deliverResults (ActivityThread.java:2918) 02-06 19: 26: 40.080: E / AndroidRuntime (10661): в android.app.ActivityThread.handleSendResult (ActivityThread.java:2970) 02-06 19: 26: 40.080: E / AndroidRuntime (10661): в android.app.ActivityThread.access $ 2000 (ActivityThread.java:132) 02-06 19: 26: 40.080: E / AndroidRuntime (10661): в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1068) 02-06 19: 26: 40.080: E / AndroidRuntime (10661): в android.os.Handler.dispatchMessage (Handler.java:99) 02-06 19: 26: 40.080: E / AndroidRuntime (10661): в android.os.Looper.loop (Looper.java:150) 02-06 19: 26: 40.080: E / AndroidRuntime (10661): в android.app.ActivityThread.main (ActivityThread.java:4277) 02-06 19: 26: 40.080: E / AndroidRuntime (10661): в java.lang.reflect.Method.invokeNative (собственный метод) 02-06 19: 26: 40.080: E / AndroidRuntime (10661): вjava.lang.reflect.Method.invoke (Method.java:507) 02-06 19: 26: 40.080: E / AndroidRuntime (10661): в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java): 839) 02-06 19: 26: 40.080: E / AndroidRuntime (10661): на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:597) 02-06 19: 26: 40.080: E / AndroidRuntime(10661): at dalvik.system.NativeStart.main (собственный метод) 02-06 19: 26: 40.080: E / AndroidRuntime (10661): вызвано: java.lang.NullPointerException: uriString 02-06 19: 26: 40.080: E / AndroidRuntime (10661): на android.net.Uri $ StringUri. (Uri.java:420) 02-06 19: 26: 40.080: E / AndroidRuntime (10661): на android.net.Uri $ StringUri. (Uri.java:410) 02-06 19: 26: 40.080: E / AndroidRuntime (10661): на android.net.Uri.parse (Uri.java:382) 02-06 19: 26: 40.080: E / AndroidRuntime (10661): на com.deitel.enhancedslideshow.SlideshowEditor.onActivityResult (SlideshowEditor.java:87) 02-06 19: 26: 40.080: E / AndroidRuntime (10661): на android.app.Activity.dispatchActivityResult (Activity.java:410)) 02-06 19: 26: 40.080: E / AndroidRuntime (10661): на android.app.ActivityThread.deliverResults (ActivityThread.java:2914)

1 Ответ

0 голосов
/ 04 февраля 2012

Таким образом, единственное, что вы добавляете к своему намерению, это:

Intent i = new Intent(IMGALLERYactivity.this, SlideshowEditor.class);                 
i.putExtra("PICTURE_ID", position);                 

Но затем вы пытаетесь получить что-то из получающегося намерения в вашем onActivityResult() методе, который вы никогда не добавляетев:

Uri selectedUri = data.getData();

Единственное, что вы могли бы вытащить из этого, это:

int position = data.getIntExtra("PICTURE_ID", 0);

Что ... вероятно, не слишком многохорошо.Вы можете добавить URI как дополнительный.

i.putExtra("PICTURE_URI", uriOfSelectedItem);

И вытащить , что , с другой стороны в onActivityResult().

...