GVKun编程网logo

Android SDK Content Loader遇到问题. parseSdkContent失败(android sdk path not specified)

39

如果您对AndroidSDKContentLoader遇到问题.parseSdkContent失败感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于AndroidSDKCont

如果您对Android SDK Content Loader遇到问题. parseSdkContent失败感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于Android SDK Content Loader遇到问题. parseSdkContent失败的详细内容,我们还将为您解答android sdk path not specified的相关问题,并且为您提供关于Android ContentProvider+ContentObserver、Android sdk content loader 0% 的解决方案、Android SDK Document 框架导读的翻译和注解[5]——Content provider、Android SDK Document 框架导读的翻译和注解[6]——Activating components: intents【用Intent激活组件】的有价值信息。

本文目录一览:

Android SDK Content Loader遇到问题. parseSdkContent失败(android sdk path not specified)

Android SDK Content Loader遇到问题. parseSdkContent失败(android sdk path not specified)

尝试更新ADT插件并下载Android 5.0 SDK后,出现错误:
“ Android SDK Content Loader遇到问题.
parseSdkContent失败
无法初始化类android.graphics.Typeface“

http://i.stack.imgur.com/xR17Y.png

我删除了Eclipse,Android SDK,“.android”和工作区文件夹.

我下载了新的Eclipse(4.4.1),ADT插件(23.0.4.1468518)和Android SDK(仅5.0 API 21):

http://i.stack.imgur.com/cjECP.png

创建一个新的空项目,我得到了同样的错误.

我应该删除它以使其看起来干净吗?

更新:我在干净的操作系统上安装了所有内容,但出现了错误.
请提供任何解决方案.

解决方法:

根据AOSP Issue Tracker,此错误是由渲染库引起的.
解决方法:

>下载API 20(4.4W)的SDK平台;
>转到/ platforms / android-21 / data文件夹;
>重命名layoutlib.jar(用于备份);
>将相同文件从android-20文件夹复制到此文件夹;
>重新启动Eclipse.

Android ContentProvider+ContentObserver

Android ContentProvider+ContentObserver

说明:文章仅供本人学习记录所用。

   1. 理解含义:

      ContentProvider: 内容提供者,将数据以表的形式进行操作。主要实现应用程序间数据共享,操作系统本地数据(包括短       信、音频、视屏、数据库)。

      ContentObserver:内容观察者,监听数据变化。

   2. 使用方法:

       ContentProvider:

       1)步骤:新建 MyProvider 类继承 ContentProvider 类;注册 URI; 重写方法(onCreate、query、bulkInsert、insert、           delete、update); 在 AndroidManifest.xml 中配置 provider;

       2)代码:

public class MyProvider extends ContentProvider {
	private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
	private static final int INSERT = 1;
	private static final int UPDATE = 2;
	private static final int DELETE = 3;
	private static final int QUERY = 4;
	private static final int INSERTS = 5;
	private DBHelper dbOpenHelper;
	private String TAG = "Provider";
	static {
		// 为UriMatcher注册si四个Uri
		matcher.addURI(Picture.AUTHORITY, "insert", INSERT);
		matcher.addURI(Picture.AUTHORITY, "update", UPDATE);
		matcher.addURI(Picture.AUTHORITY, "delete", DELETE);
		matcher.addURI(Picture.AUTHORITY, "query", QUERY);
		matcher.addURI(Picture.AUTHORITY, "inserts", INSERTS);
		//说明Picture.AUTHORITY:表示你要操作的ContentProvider,一般以要操作的实体类的包名命名。
	}

	@Override
	public boolean onCreate() {
	        //获取数据库辅助类
		dbOpenHelper = DBHelper.getInstance(getContext());
		DatabaseManager.initializeInstance(dbOpenHelper);
		return true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		// TODO Auto-generated method stub
		int code = matcher.match(uri);
		Cursor c = null;
		switch (code) {
		case QUERY:
			SQLiteDatabase database = dbOpenHelper.getReadableDatabase();
			c = database.query("picture", projection, selection, selectionArgs,
					nullnull, sortOrder);

			c.setNotificationUri(getContext().getContentResolver(), uri);
			DatabaseManager.getInstance().closeDatabase();
		case UriMatcher.NO_MATCH:
			Log.i(TAG, "------------未知的URI" + uri);
			break;
		}
		return c;
	}

	@Override
	public String getType(Uri uri) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		int code = matcher.match(uri);
		switch (code) {
		case INSERT:
			SQLiteDatabase database = DatabaseManager.getInstance()
					.openDatabase();// 线程安全并发操作数据库
			try {// 获得数据库实例
				database.insert("picture"null, values);
				getContext().getContentResolver().notifyChange(uri, null);
			} catch (Exception ex) {
				Log.i(TAG, "insert ex=====" + ex.toString());
			} finally {
				DatabaseManager.getInstance().closeDatabase();
			}
			break;
		case UriMatcher.NO_MATCH:
			Log.i(TAG, "------------未知的URI" + uri);
			break;
		}

		return null;
	}
	/**
	 * 批量插入
	 */
	@Override
	public int bulkInsert(Uri uri, ContentValues[] values) {
		int code = matcher.match(uri);
		switch (code) {
		case INSERTS:
			SQLiteDatabase database = DatabaseManager.getInstance()
					.openDatabase();// 线程安全并发操作数据库
			try {// 获得数据库实例
				int numValues = 0;
				numValues = values.length;
				for (int i = 0; i < numValues; i++) {
					ContentValues value = values[i];
					database.delete("picture""name = ?",
							new String[] { String.valueOf(value.get("name")) });
					Log.i(TAG,
							"name===== values"
									+ String.valueOf(value.get("name")));
					database.insert("picture"null, values[i]);
					Log.i(TAG, "Value insert====" + i);
				}
				getContext().getContentResolver().notifyChange(uri, null);
			} catch (Exception ex) {
				Log.i(TAG, "insert ex=====" + ex.toString());
			} finally {
				DatabaseManager.getInstance().closeDatabase();
			}
			break;
		case UriMatcher.NO_MATCH:
			Log.i(TAG, "------------未知的URI" + uri);
			break;
		}

		return 0;

	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		int code = matcher.match(uri);
		switch (code) {
		case DELETE:
			SQLiteDatabase database = DatabaseManager.getInstance()
					.openDatabase();
			int i = 0;
			try {
				i = database.delete("picture", selection, selectionArgs);
				if (i > 0) {
					getContext().getContentResolver().notifyChange(uri, null);
				}
			} catch (Exception ex) {
				Log.i(TAG, "delete ex====" + ex.toString());
			} finally {
				// database.close();
				DatabaseManager.getInstance().closeDatabase();
			}

			return i;
		case UriMatcher.NO_MATCH:
			Log.i(TAG, "------------未知的URI" + uri);
			break;
		}
		return 0;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		// TODO Auto-generated method stub
		int code = matcher.match(uri);
		switch (code) {
		case UPDATE:
			// SQLiteDatabase database = dbOpenHelper.getReadableDatabase();
			SQLiteDatabase database = DatabaseManager.getInstance()
					.openDatabase();
			int i = 0;
			try {
				i = database
						.update("picture", values, selection, selectionArgs);
				if (i != 0) {
					getContext().getContentResolver().notifyChange(uri, null);
				}
			} catch (Exception ex) {
				Log.i(TAG, "update ex===" + ex.toString());
			} finally {
				// database.close();
				DatabaseManager.getInstance().closeDatabase();
			}
			return i;
		case UriMatcher.NO_MATCH:
			Log.i(TAG, "------------未知的URI" + uri);
			break;
		}
		return 0;
	}

}

//在数据库操作类中添加以下方法。
//单条数据添加
public static void addPicture(Picture picture) {
		Uri uri = Uri.parse("content://" + Picture.AUTHORITY + "/insert");
		ContentValues values = new ContentValues();//封装数据
		values.put("name", picture.name);
		...
		AppApplication.getInstance().getContentResolver().insert(uri, values);
	}
//多条数据添加
public static void addPictures(List<Picture> pictures) {
		Uri uri = Uri.parse("content://" + Picture.AUTHORITY + "/inserts");
		ContentValues[] values = new ContentValues[pictures.size()];
		for (int i = 0; i < pictures.size(); i++) {
			Picture picture = pictures.get(i);
			ContentValues value = new ContentValues();
			value.put("name", picture.name);
			...
			values[i] = value;
		}
		Log.i(TAG, "addPictures_values_size=====" + values.length);
		AppApplication.getInstance().getContentResolver().bulkInsert(uri, values);
	}	
//删除操作
public static void deletePictureTag() {
		Uri uri = Uri.parse("content://" + Picture.AUTHORITY + "/delete");
		int i = AppApplication.getInstance().getContentResolver()
				.delete(uri, "whereName = ?"new String[] { "value" });
	}	

//修改操作
public static void updatePicture(Picture picture) {
		Uri uri = Uri.parse("content://" + Picture.AUTHORITY + "/update");
		ContentValues values = new ContentValues();
		values.put("tagStatus", picture.tagStatus);
		int i = AppApplication.getInstance().getContentResolver()
				.update(uri, values, "whereName = ?"new String[] { picture.name });
	}	
//AndroidManifest.xml中配置provider
<provider
            android:name="com....provider.MyProvider"//包名
            android:authorities="com....provider.myProvide" />

  ContentObserver:

   1) 步骤:注册与注销 ContentObserver;添加 ContentObserver 方法。

   2) 代码:

//uri与provider中注册的uri对应
Uri uri = Uri.parse("content://" + Picture.AUTHORITY + "/insert");//监听添加
getContentResolver().registerContentObserver(uri, true, cob);
Uri uri_inserts = Uri.parse("content://" + Picture.AUTHORITY+ "/inserts");//监听批量添加
getContentResolver().registerContentObserver(uri_inserts, true, cob);
Uri uri_update = Uri.parse("content://" + Picture.AUTHORITY + "/update");//监听修改
getContentResolver().registerContentObserver(uri_update, true, cob);

getContentResolver().unregisterContentObserver(cob);//在onDestroy销毁

//监听数据改变的方法
private ContentObserver cob = new ContentObserver(new Handler()) {
		@Override
		public boolean deliverSelfNotifications() {
			return super.deliverSelfNotifications();
		}

		@Override
		public void onChange(boolean selfChange) {
			super.onChange(selfChange);
			//改变数据时做出相应的操作
			......
			}
}



Android sdk content loader 0% 的解决方案

Android sdk content loader 0% 的解决方案

方法参考 http://jingyan.baidu.com/article/8cdccae99a6d4b315413cd97.html,比较推荐方法 4

关闭 Eclipse,删掉 Eclipse WorkSpace 下.metadata\.plugins\org.eclipse.core.resources\.projects 文件夹下的所有内容,再重启 Eclipse。

Android SDK Document 框架导读的翻译和注解[5]——Content provider

Android SDK Document 框架导读的翻译和注解[5]——Content provider

Content provider:
Content provider将当前应用程序的某些特定数据,提供给其他应用程序。这些数据可以存储在文件系统,SQLite数据库,或者是任意其他有意义的存储方式。content provider 继承自ContentProvider基类,实现了一些标准的方法集合,这些方法可以让其他的应用程序访问和存储content provider控制数据类型。但是, 应用程序并不是直接调用这些方法,而是用一个ContentResolver对象调用这些方法。ContentResolver可以和任意 contentProvider对话,ContentResolver 通过和provider的协作,实现跨进程的通信。

  查看文档中关于Content Provider的部分,获得更多关于content provider的使用。



  通观Android这四类组件和进程的关系:只要存在一个请求需要被特定的组件处理,Android必须保证组件所在的应用程序进程是运行的, 如有需要(比如,应用程序进程不存在的情况下),启动这个应用程序进程, 同时需保证存在可用的组件实例, 如有需要(比如,组件被销毁),创建这个组件实例。

 

 


例一: 使用系统提供的数据, 典型应用是联系人和电话的查询,下面是一个典型的所有电话号码的查询:

// Get a cursor with all phones 
Cursor c = getContentResolver().query(Phones.CONTENT_URI, null, null, null, null); startManagingCursor(c); 
// Map Cursor columns to views defined in simple_list_item_2.xml 
ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, c, new String[] { Phones.NAME, Phones.NUMBER }, new int[] { android.R.id.text1, android.R.id.text2 }); 
setListAdapter(adapter);

 

为自己的应用程序实现数据访问的ContentProvider:

以Content Provider的方式访问数据, 需要准备以下几个步骤:

1. 继承ContentProvider类

2. 定义public static final 的Uri类型变量, 并命名为CONTENT_URI 并设置好它的标准头部, 授权, 数据类型等.

3. 构件数据存储, 数据存储一般有:Preferences, files, DataBases, NetWorks

4. 实现1中的抽象方法, 特别是insert, query, delete, update方法, 这些方法都是对3中具体数据存储操作的封装.

 

当然, 还需要在AndroidManifest中定义.


原文链接: http://blog.csdn.net/ostrichmyself/article/details/5662355

Android SDK Document 框架导读的翻译和注解[6]——Activating components: intents【用Intent激活组件】

Android SDK Document 框架导读的翻译和注解[6]——Activating components: intents【用Intent激活组件】

Activating components: intents【组件激活】


这里提到的Intent,类似于Content Provider,也是用户消息传递的, 但两者存在区别:
当一个从ContentResolver的请求的目标是Content Provider时,这个content Provider被激活。 前面提到的其他三种组件(Activity,Service, broadcast receiver)是通过被称为Intent的异步消息被激活的。 而ContentProvider仅仅是应用程序之间进行数据的访问, 如果一个应用程序的数据需要公布给其它程序访问, 那么就设定一个ContentProvider.

Intent对象持有异步消息, 对于Activity, 除了其他事情,Intent特别指定需要激活的Activity名称;对于Service,除了其他事情,Intent特别指定需要操作数据的URI。例 如,传递一个请求,让一个Activity为用户呈现一个图片,或者让用户编辑某个文本。 对于broadcast receiver而言, Intent对象指定需要通知的action名称。比如当相机的按钮按下去后,可以通知应用程序中,对此有兴趣组件。

激活不同的组件,存在不同的方法:

Activity: Activity 的启动时通过传递一个intent对象到Context.startActivity() 或者 Activity.startActivityForResult(). 这样,响应的Activity就启动了,响应的Activity 可以通过getIntent()方法查看让它启动的Intent中的内容。 响应的Activity 调用onNewIntent()方法,传递就可以获取传递过来的Intent。
前一个Activity经常启动下一个Activity, 如果前一个Activity需要下一个Activity的结果,则前一个Activity可以调用startActivityForResult() 而不是调用startActivity(). 例如, 如果启动了一个Activity,让用户选择一个图片。则可以返回选择的这幅图片。前一个Activity通过调用方法 onActivityResult()方法,从Intent对象中获得返回结果。

 

Service:Service的启动是通过传递一个Intent对象到Context.startService()中,Android调用Service的onStart()方法,传递这个对象。同样地,Intent对象可以传递给Context.bindService(),从而确定发起调用的组件和目标Service之间,即将确立的通信。 Service通过调用onBind()方法,接收Intent对象。(如果Service还未启动,bindService可以选择启动 Service). 比如某个Activity确定和音乐播放的Service关联,这样这个Activity就可以为用户提供一个UI去控制播放。这个Activity可以 调用bindService()建立这个连接, 然后service中定义的方法,从而控制播放。
后续章节中, Remote procedure calls,将提到更多关于bind service的细节。

broadcast: 应用启动一个broadcast, 可以通过传递intent给这些方法,如Context.sendBroadcast(), Context.sendOrderedBroadcast(), Context.sendStickyBroadcast()以及这些方法的变种。Android传递这些Intent给所有感兴趣的broadcast receiver, 是通过调用broadcast 的onReceiver()方法。

更多Intent的信息,请查看独立的章节Intents and Intent Filters

 


原文链接: http://blog.csdn.net/ostrichmyself/article/details/5665072

今天的关于Android SDK Content Loader遇到问题. parseSdkContent失败android sdk path not specified的分享已经结束,谢谢您的关注,如果想了解更多关于Android ContentProvider+ContentObserver、Android sdk content loader 0% 的解决方案、Android SDK Document 框架导读的翻译和注解[5]——Content provider、Android SDK Document 框架导读的翻译和注解[6]——Activating components: intents【用Intent激活组件】的相关知识,请在本站进行查询。

本文标签: