2011-02-06 2 views
3

Я начал с примера блокнота на веб-сайте Android. То, что я сделал, это добавить другую таблицу в базу данных и сделать ее доступной в классе NotePad (добавлен еще один внутренний класс с именем Table, который расширился BaseColumns). Кажется, что база данных читается правильно, и я могу запустить мой просмотр напрямую. Однако, когда я пытаюсь запустить его так же, как google запускает NoteEditor (с помощью намерения ACTION_INSERT), приложение аварийно завершает работу.Не найдено исключение

У меня обновленный URI для новой таблицы, а фильтр намерений для активности, которую я хочу запустить, находится в манифесте (с соответствующим типом mimetype). Однако, похоже, он не сможет найти и запустить ту деятельность, которую я хочу.

Вот вывод, что имеет отношение:

02-04 01:13:54.964: DEBUG/AndroidRuntime(342): Shutting down VM 
02-04 01:13:54.964: WARN/dalvikvm(342): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342): FATAL EXCEPTION: main 
**02-04 01:13:54.984: ERROR/AndroidRuntime(342): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.INSERT dat=content://com.google.provider.NotePad/courses }** 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1408) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1378) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at android.app.Activity.startActivityForResult(Activity.java:2827) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at android.app.Activity.startActivity(Activity.java:2933) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at com.example.android.notepad.CoursesList.onOptionsItemSelected(CoursesList.java:154) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at android.app.Activity.onMenuItemSelected(Activity.java:2205) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:748) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:143) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:532) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at android.view.View$PerformClick.run(View.java:9080) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at android.os.Handler.handleCallback(Handler.java:587) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at android.os.Handler.dispatchMessage(Handler.java:92) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at android.os.Looper.loop(Looper.java:123) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at android.app.ActivityThread.main(ActivityThread.java:3647) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at java.lang.reflect.Method.invoke(Method.java:507) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
02-04 01:13:54.984: ERROR/AndroidRuntime(342):  at dalvik.system.NativeStart.main(Native Method) 
02-04 01:13:55.014: WARN/ActivityManager(61): Force finishing activity com.example.android.notepad/.CoursesList 

Я имею намерения фильтр в моем манифесте:

<activity android:name="AddCourseView" 
     android:theme="@android:style/Theme.Light" 
     android:label="@string/title_note" 
     android:screenOrientation="sensor" 
     android:configChanges="keyboardHidden|orientation" 
    > 
     <!-- This filter says that we can view or edit the data of 
      a single note --> 
     <intent-filter android:label="@string/resolve_course_edit"> 
      <action android:name="android.intent.action.VIEW" /> 
      <action android:name="android.intent.action.EDIT" /> 
      <action android:name="com.android.notepad.action.EDIT_COURSE" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:mimeType="vnd.android.cursor.item/vnd.google.course" /> 
     </intent-filter> 

     <!-- This filter says that we can create a new note inside 
      of a directory of notes. --> 
     <intent-filter> 
      <action android:name="android.intent.action.INSERT" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:mimeType="vnd.android.cursor.dir/vnd.google.course" /> 
     </intent-filter> 

    </activity> 

здесь есть код, где намерение получает запущен:

 Uri intentUri = getIntent().getData(); 
     Intent intent = new Intent(Intent.ACTION_INSERT, intentUri); 
     startActivity(intent); 

Метод getType() в NotePadProvider:

@Override 
public String getType(Uri uri) { 
    switch (sUriMatcher.match(uri)) { 
    case NOTES: 
    case LIVE_FOLDER_NOTES: 
     return Notes.CONTENT_TYPE; 

    case NOTE_ID: 
     return Notes.CONTENT_ITEM_TYPE; 

    case COURSES: 
     return Courses.CONTENT_TYPE; 

    case COURSE_ID: 
     return Courses.CONTENT_ITEM_TYPE; 

    default: 
     throw new IllegalArgumentException("Unknown URI " + uri); 
    } 
} 

здесь, где я определить типы:

общественный конечный класс NotePad { общественности статической конечной строки ДНУ = "com.google.provider.NotePad";

// This class cannot be instantiated 
private NotePad() {} 

/** 
* Notes table 
*/ 
public static final class Notes implements BaseColumns { 
    // This class cannot be instantiated 
    private Notes() {} 

    /** 
    * The content:// style URL for this table 
    */ 
    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/notes"); 

    /** 
    * The MIME type of {@link #CONTENT_URI} providing a directory of notes. 
    */ 
    public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.note"; 

    /** 
    * The MIME type of a {@link #CONTENT_URI} sub-directory of a single note. 
    */ 
    public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.note"; 

    /** 
    * The default sort order for this table 
    */ 
    public static final String DEFAULT_SORT_ORDER = "modified DESC"; 

    /** 
    * The title of the note 
    * <P>Type: TEXT</P> 
    */ 
    public static final String TITLE = "title"; 

    /** 
    * The note itself 
    * <P>Type: TEXT</P> 
    */ 
    public static final String NOTE = "note"; 

    /** 
    * The task content 
    * <P>Type: TEXT</P> 
    */ 
    public static final String TASK_DESCRIPTION = "description"; 
    /** 
    * The task location 
    * <P>Type: TEXT</P> 
    */ 
    public static final String TASK_LOCATION = "location"; 

    /** 
    * The task start time 
    * as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC 
    */ 
    public static final String TASK_START_TIME = "starttime"; 

    /** 
    * The task end time 
    * as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC 
    */ 
    public static final String TASK_END_TIME = "endtime"; 


    /** 
    * The timestamp for when the note was created 
    * <P>Type: INTEGER (long from System.curentTimeMillis())</P> 
    */ 
    public static final String CREATED_DATE = "created"; 

    /** 
    * The timestamp for when the note was last modified 
    * <P>Type: INTEGER (long from System.curentTimeMillis())</P> 
    */ 
    public static final String MODIFIED_DATE = "modified"; 

    /** 
    * if it is an assignment/test, the weight of it is here 
    */ 
    public static final String WEIGHT = "weight"; 

    /** 
    * the course the note is assigned to 
    */ 
    public static final String RELATED_COURSE = "relatedcourse"; 


} 

/** 
* Courses table 
*/ 
public static final class Courses implements BaseColumns { 
    // This class cannot be instantiated 
    private Courses() {} 

    /** 
    * The content:// style URL for this table 
    */ 
    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/courses"); 

    /** 
    * The MIME type of {@link #CONTENT_URI} providing a directory of notes. 
    */ 
    public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.course"; 

    /** 
    * The MIME type of a {@link #CONTENT_URI} sub-directory of a single note. 
    */ 
    public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.course"; 

    /** 
    * The default sort order for this table 
    */ 
    public static final String DEFAULT_SORT_ORDER = "modified DESC"; 

    /** 
    * The title of the note 
    * <P>Type: TEXT</P> 
    */ 
    public static final String TITLE = "title"; 

    public static final String PROFESSOR = "professor"; 

    public static final String DESCRIPTION = "description"; 

    /** 
    * The timestamp for when the note was created 
    * <P>Type: INTEGER (long from System.curentTimeMillis())</P> 
    */ 
    public static final String CREATED_DATE = "created"; 

    /** 
    * The timestamp for when the note was last modified 
    * <P>Type: INTEGER (long from System.curentTimeMillis())</P> 
    */ 
    public static final String MODIFIED_DATE = "modified"; 
} 

}

здесь является поставщиком часть манифеста:

<provider android:name="NotePadProvider" 
     android:authorities="com.google.provider.NotePad"/> 

ок, я изменил намерения запуска на это:

 Intent intent = new Intent(Intent.ACTION_INSERT); 
     intent.setType(Courses.CONTENT_TYPE); 
     startActivity(intent); 

так не должно быть путаница по типу. и теперь я получаю эту ошибку:

02-06 22: 48: 26.076: ERROR/AndroidRuntime (640): java.lang.RuntimeException: не удалось запустить Activity ComponentInfo {com.example.android.notepad/com.example .android.notepad.AddCourseView}: java.lang.NullPointerException

+0

Показать полный NPE StackTrace –

+0

я бы была догадка ... com.example.android.notepad.AddCourseView не существует. Правильно ли путь пакета? Правильно ли указано имя класса? Увеличивает ли активность AddCourseView активность? – techiServices

+0

Это то, что я подумал, все, что я сделал, это изменить имя AddCourseView на CourseEditor и «обновить ссылки» в eclipse и, похоже, сработает. также я изменил манифест из «AddCourseView» на «CourseEditor» – evan

ответ

2

Я бы предположил, что у вас есть проблема с вашими намерениями.

Edit:

Пожалуйста, пост поставщика часть манифеста :)

Edit 2:

com.example.android.notepad.AddCourseView не существует.

Правильно ли путь к пакету? Является ли название класса правильным? Добавляет ли AddCourseView активность?

Не стесняйтесь пометить меня ... еще 2, и я могу удалить сообщение и получить значок ...

+2

. Будьте более конкретны с вашим ответом. Угадав, что не так, и не предоставил никакой информации о том, почему у него возникла проблема или как ее исправить, практически ничего не дает сообществу. –

+0

Вы хотите, чтобы я написал для него код ... plank – techiServices

+0

Я предоставил код, пожалуйста, посмотрите. – evan

0

Ваша активность соответствует только типу контента «vnd.android.cursor.item/vnd.google.course». Вероятно, ваш контент-провайдер не предоставляет этот тип контента (в методе getType()) для этого URI: content: //com.google.provider.NotePad/courses.

+0

У меня есть этот тип в gettype, я отправлю его один раз – evan

+0

Я разместил весь соответствующий код, любая помощь, которую вы можете мне дать, будет оценена имея эту ошибку некоторое время. Я уверен, что это что-то простое – evan

0

ОК, ваш вопрос очень хороший, но он пропускает некоторые фрагменты информации.

Прежде всего, здесь цель:

act=android.intent.action.INSERT dat=content://com.google.provider.NotePad/courses 

так что действие является правильным, но, кажется, чтобы данные были неправильными. Вы установили данные в Uri элементов, но вы должны установить его в тип контента, который равен vnd.android.cursor.dir/vnd.google.course. Поступая таким образом, он откроет активность.

+0

Я установил его для типа контента, потому что в NotesList в коде Google они имеют: intent.setData (Notes.CONTENT_URI); поэтому они также установили его в содержание uri, в моем CoursesList, я установил его в Courses.CONTENT_URI. к чему я должен его изменить? – evan

+0

Это сделано по другой причине - и я понял, что это вводит в заблуждение после того, как я узнаю все о намерениях и т. Д. Я не вижу, как он может работать так, как сейчас. – Aliostad

+0

извините, если им не совсем понятно. как я могу это исправить? я изменяю намерение.setData в методе onCreate для моего CoursesList или есть что-то еще, что мне нужно добавить? – evan

0

Я исправил эту проблему, добавив активность в манифест, однако поставил точное имя класса с информацией о пакете.

например: com.faceworld.galleryActivity

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