Это держит меня без сна ...
Я создаю приложение в виде слайд-шоу. Допустим, имя пакета 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)