Android Document——2.4.1 基本的Content Provider
一个Content Provider的管理器能够访问中央存储库的数据。一个provider是android程序的一部分,该provider通常提供它自己的UI供数据使用。然而,contentprovider最初的目的是被别的app使用client provider object访问数据使用的。Provider和客户端的provider提供一个一致的数据标准接口,该接口还处理进程间通信以及安全的数据访问。
该文档包括下面的要点:
● content provider如何工作
● 从content provider中检索数据需要的API
● 向content provider中插入,修改或删除数据时需要的API
● 别的可以便捷的使用content provider的API
Overview
Contentprovider以类似数据库中的表的形式,对外部的app表现数据。它们可以表现一张或多张表。一行表示provider中存储的一些类型的数据的一个实例,而每一列表示该实例中的单独的数据片段。
例如,在android平台中的多个内置provider中,有一个是用户的词典。该provider中存储了用户希望保存的非标准词语的拼写。下表表明在provider中保存的数据可能的样子:
Table 1
word |
app id |
frequency |
locale |
_ID |
mapreduce |
user1 |
100 |
en_US |
1 |
precompiler |
user14 |
200 |
fr_FR |
2 |
applet |
user2 |
225 |
fr_CA |
3 |
const |
user1 |
255 |
pt_BR |
4 |
int |
user5 |
100 |
en_UK |
5 |
在表一中,每一行表示一个可能不会在标准词典中找到的词的实例。每一列代表这个词的一些数据,例如是谁最初碰到这个词的。每列的第一行是保存在provider中列的名字。对该provider而言,_ID这一列在provider中自动作为关键字列作用。
Note:一个provider并不要求拥有一个“关键字”,也不要求使用_ID作为主键的列名。然而,当你希望将provider中的数据绑定到ListView时,其中一个列的名字必须为_ID。主要原因会在下面Displayingquery results中解释。
Accessing a provider
一个app通过ContentResolver客户端对象可以从contentprovider中获取数据。该对象有与provider对象相同名字的方法,而provider对象是ContentProvider的子类实例。ContentResolver方法提供基础的“CRUD”(create,retrieve,update and delete)功能维持存储。
ContentResolver对象在客户端app线程中而ContentProvider对象在app中拥有的provider自动处理的进程间通信里。ContentProvider也充当一个在抽象层之间的存储库的数据和实际表现出来的数据的表格。
Note: 为了访问provider,你的app通常需要在manifest文件中请求特殊的许可。在后文中的Content Provider Permissions中会讨论到。
例如,想要从用户的Dictionary Provider中获取一列词以及他们的locales,你需要调用ContentResolver.query().该方法会调用被UserDictionary Provider定义的方法ContentProvider.query()。下面代码显示一个ContentResolver.query()的调用:
//Queries the user dictionary and returns results
mCusor= getContentResolver.query(
UserDictionary.Words.CONTENT_URI,//Thecontent URI of the words table
mProjection, //The columns to return foreach row
mSelectionClause, //Selection criteria
mSelectionArgs, //Selection criteria
mSortOrder); //The sort order for thereturned rows
下表二显示了query方法中的参数与SQL SELECT statement是如何匹配的:
query() argument |
SELECT keyword/parameter |
Notes |
Uri |
FROM table_name |
Uri映射provider中名叫table_name的表 |
projection |
col,col,col,... |
Projection是很多列的集合,它应该包括每一行的检索 |
selection |
WHERE col = value |
Selection声明从行中获取数据的条件 |
selectionArgs |
(No exact equivalent. Selection arguments replace ? placeholders in the selection clause.) |
|
sortOrder |
ORDER BY col,col,... |
SortOrder声明列在返回cursor的时候以哪个值排序 |
Content URIs
一个Content URI是一个识别provider中数据的URI。ContentURIs包括整个provider(its authority)的符号名(symbolic name)以及指向一张表的名字(a path)。当你调用一个客户端的方法访问一个provider中的一张表,该content URI只这张表的一个参数。
之前的代码中,常量CONTENT_URI包含user dictionary的“words”表的content URI。ContentResolver对象解析出URI的authority,并使用该authority解析该provider——通过比较该authority与系统中已知provider的authority。ContentResolver可以发送查询参数给对应的provider。
ContentProvider使用content URI的path部分来连接正确的table。一个Provider中的每一个表通常都有不同的path。
例如,在前面代码中“words”表完整的URI是:
content://user_dictionary/words
当user_dictionary字符串是provider authority的时候,words字符串就是这个表的path。字符串content://…通常总是显式的,并且被识别为content URI。
许多provider通过在URI末尾添加一个ID值,允许你访问表中一个单独的行。例如,从用户的词典中检索一行_ID是4的数据,你可以如下使用content URI:
Uri singleUri =ContentUris.withAppendedId(UserDictionary.Words.CONTENT_URI,4);
当你要检索许多行数据,然后对他们进行删除或更新操作的时候,需要经常使用Id值。
Note: Uri类和Uri. Builder类包含可以通过String创建结构精简的Uri对象的便捷的方法。ContentUris包含可以将ID值添加到URI的便捷方法。前面的小片段就使用了withAppendedId()方法将一个id添加到UserDictionary content URI.
Retrieving Data from the Provider
下面的部分描述如何从provider中获取数据,还是使用User Dictionary Provider作为例子。为了达到清晰的目的,下面的代码是在“UI线程”中的ContentResolver.query()方法中运行。在实际的代码中,你应该将query方法运行在别的线程中。方法之一是使用CursorLoader类,这个类在Loader指引中会有更清晰的描述。注意,下面是代码片段,它们并不代表一个完整的应用。
为了从provider中获取数据,要遵从下面的基本步骤:
1. 获取provider的阅读权限
2. 编写可以向provider发送查询语句的代码
Requesting read access permission
为了从provider中获取数据,你的app需要provider提供的“读取许可”。你不可以在运行期间才请求获取该许可,这个许可必须定义在app的manifest文件中。当你在你的manifest文件中用<uses-permission>声明获取provide许可后,你的app就可以访问provider了。当用户安装你的app后,app会隐式的获得provider的许可。
为了获得你要使用的provider的名字从而获取它的读取许可,可以阅读provider的文档查询。在Content Provider Permissions文档中可以查阅更多详细数据。
例如,使用用户词典Provider可以在manifest文件中声明该许可:android.permission.READ_USER_DICTIONARY,即可使用该provider。
Constructing the query
从provider中检索数据的下一步是创建一个query。下面的片段声明了一些访问User Dictionary Provider的变量:
// A “Projection ” defines the columns that willbe returned for each row
String [] mProjection = {
UserDictionary.Words._ID,//Contract class constant for the _ID column name
UserDictionary.Words.WORD,//… for the word column name
UserDictionary.Words.LOCAL//… for the local column name
};
//Defines a string to contain the selectionclause
String mSelectionClause = null;
//Initializes an array to contain selectionarguments
String[] mSelectionArgs= {“”};
接下来代码片段以User Dictionary Provider作为例子展示如何使用ContentResolver.query()。一个provider客户端query与一条SQL query非常相像,并且它包含一个返回队列的集合,一个选择标准的集合以及排列次序。
为了获取返回的队列的集合,query必须调用一个projection(上面的变量mProjection)
表达式声明了需要检索的行,它被分裂成一条选择字句和选择参数。选择子句是逻辑表达式,布尔表达式,column name,和值的混合体。(参数mSelectionClause)。如果你用?代替值,则query方法会从选择参数数组中检索相应的值(参数mSelectionArgs)。
在下一个片段中,如果用户一个词也不输入,则选择子句会被设置为null,而query返回provider中所有的词汇。如果用户输入一个词,选择子句则会设置为UserDictionary.Words.Word+”= ? ”,在选择参数集合中的第一个元素则会被设置为用户键入。
// This defines a one-element String array to containthe selection argument
String [] mSelectionArgs={“”};
//Get a word from the UI
mSearchString = mSearchWord.getText().toString();
//Remember to insert code here to check forinvalid or malicious input
//If the word is the empty string ,gets everything
if (TextUtils.isEmpty(mSearchString)){
//Settingthe selection clause to null will return all words
mSelectionClause= null;
mSelectionArgs[0]=“”;
} else {
//Constructsa selection clause that matches the word that the user entered.
mSelectionClause= UserDictionary.Words.Word + “=?”;
//Movethe user’s input string to the selection arguments.
mSelectionArgs[0]=mSearchString;
}
// Does a query against the table and returns aCursor object
mCursor = getContentResolver.query(
UserDictionary.Words.CONTANT_URI,//The content URI of the word table
mProjection, //Thecolumns to return for each row
mSelectionClause, //Either null, orthe word user entered
mSelectionArgs, //Either empty, orthe string the user entered
mSortOrder); //The sortorder for the returned rows
// Some providers return null if an error occurs,other throw an exception
if (null == mCursor){
//Insert codehere to handle the error. Be sure not to use the cursor! You may //want to callandroid.util.Log.e() to log this error
//ifthe Cursor is empty, the provider found no mathes
} else if (mCursor.getCount()<1){
/*Insertcode here to notify the user that the search was unsuccessful. This isn’t
* necessarilyan error. You may want to offer the user the option to insert a
* new row, orre-type the search term.
*/
} else {
//Insertcode here to do something with the result
}
该query与SQL语法非常类似:
SELECT _ID, word , locale FROM words WHEREword=<userinput> ORDER BY word ASC;
在上面的SQL语法中,使用的是列本身的名字,而非创建一个contract类实例。
Protecting against malicious input
如果被content provider管理的数据是保存在SQL数据库中的,包括外部的不可信的数据为原始的SQL语句都可能导致SQL注入。
考虑下面的selection子句:
//Constructs a selection clause by concatenatingthe user’s input to the column name
String mSelectionClause = “var= ”+mUserInput;
如果你这样做,你就已经允许用户在你的SQL语句中注入非法输入。例如,用户可以输入“nothing;DROP TABLE *;”,这也是mUserInput的值,这样会导致在选择语句中var =nothing; DROPTABLE *; 当该查询子句执行的时候,就可能导致provider清除掉在底层SQLite数据库中的所有的表格。(除非该provider设置为可以捕获SQL注入企图)
为了避免这种情况,可以在选择子句中使用?替代输入的参数,并且将选择参数拆分为数组。如果你这样处理,用户的输入就会直接绑定到query中,而不是直接注入SQL的执行语句作为其一部分。因为query并不能作为SQL一样对待,所以用户的输入并不能向SQL恶意注入。使用下面的选择子句而不是将用户的输入连接在一起:
//Constructs a selection clause with areplaceable parameter
String mSelectionClause = “var = ?”;
然后如下设置选择参数的数组:
//Defines an array to contain the selection arguments
String[] selectionArgs = {“”};
如下所示给选择参数的数组赋值:
//Sets the selection argument to the user’s input
selectionArgs[0]=mUserInput;
一个选择子句使用?作为替代参数并且使用选择参数数组是一个声明selection语句的好方法,尽管provider并不一定基于SQL数据库。
Displaying query results
ContentResolver.query()客户端方法总是返回一个Cursor,该Cursor包含被query的projection声明的行匹配query的selection选择出来的队列。一个Cursor对象会对它包含的行和列提供随机的阅读访问。使用Cursor方法,你可以迭代结果中所有的行,确定每列的数据类型,从列中取出数据,以及检查结果中的其他性质。一些Cursor实例会在provider的数据改变时自动更新,或会在Cursor或provider改变的时候触发监视对象的方法。
Note: 一个provider可能通过创建query的对象来限制对其列的访问。例如,Contacts Provider限制同步适应器(sync adapter)访问一些列,所以它不会将值返回给任何一个activity或service。
如果没有行匹配选择条件,provider会返回一个Cursor.getCount()值为0的Cursor对象。(就是一个空的Cursor)
如果发生了内部错误,query的结果则依赖于一个特殊的provider。该provider可以选择返回null,也可以抛出Exception。
一旦Cursor是许多行的“list”,通过SimpleCursorAdapter将它们作为一个ListView显示出来是一个很好的方法。
下面的代码片段包含前面展示的代码片段。下面创建了一个SimpleCursorAdapter对象包含通过query检索出来的Cursor对象,同时将该对象设置为Listview的adapter。
//Defines a list of columns to retrieve from theCursor and load into an output row
String[] mWordListColumns= {
UserDictionary.Words.WORD,
//Contractclass constant containing the word column name
UserDictionary.Words.LOCALE
//Contractclass constant containing the locale column name
};
//Defines a list of View IDs that will receivethe Cursor columns for each row
int[] mWordListItems = {R.id.dictWrod,R.id.locale};
//Creates a new SimpleCursorAdapter
mCursorAdapter = new SimpleCursorAdapter (
getApplicationContext(),//The application’s Context object
R.layout.wordlistrow, //A layout in XML for one row inthe ListView
mCursor, //The resultfrom the query
mWordListColumns, //A String array of column names in thecursor
mWordListItem, //An integer array of view IDsin the row layout
0); //Flags(usually none are needed)
//Sets the adapter for the ListView
mWordList.setAdapter(mCursorAdapter);
Note:返回一个带有Cursor的ListView,该cursor必须包含一个名为_ID的列。因为query会优先检索“words”表的_ID列,即使ListView并不会显示该列。这样的检索方式解释了为什么大多数provider都会在他们的表中具有_ID列。
Getting data from query results
与其简单的显示query的结果,你还可以将他们使用到别的方面。例如,你可以从用户的词典中检索拼写,然后再用它们检索别的provider。为了达到这个目的,你可以如下遍历Cursor中的每一行:
//Determine the column index of the column named “word”
int index =mCursor.getColumnIndex(UserDictionary.Words.WORD);
//Only executes if the cursor id valid. The UserDictionary Provider returns null if
//an internal error occurs. Other providers maythrow an Exception instead of //returning null;
if (mCursor !=null){
/*Movesto the next row in the cursor. Before the first movement in the cursor,
*the “rowpointer” is -1, and if you try to retrieve data at the position you will
*getan exception
*/
while(mCursor.moveToNext()){
//gets the value from the column
newWord = nCursor.getString(index);
// insert code here to process theretrieved word
…
// end of while loop
}
} else {
//insert codehere to report an error if the cursor is null or the provider threw an//exception
}
Cursor实施包含了许多“get”方法以便检索对象中的不同类型数据。例如,前面的片段使用了getString()方法。Cursor也有getType()方法返回数据列的类型。
Content Provider Permissions
一个provide的应用可以声明许可,别的app想要访问该provide获取数据时需要获得该许可。这些许可保证了用户知道哪些app试图访问provide并获取数据。基于provider的要求,别的app在访问provider时需要发送请求获得许可。用户在安装app的时候会看到要求获得许可的请求。
如果一个provide应用程序并不要求任何许可,那么别的app则不能访问该provider的数据。然而,除了特殊的权限外,在该provider应用程序中的组件(component)是有全部的读写权限的。
正如之前提到的,想要通过用户字典Provider检索其中的数据,需要提供权限 android.permission.READ_USER_DICTIONARY。该provide还有插入,修改以及删除数据的权限要求:android.permission.WRITE_USER_DICTIONARY。
为了获取读写provide的权限,app必须在<user-permission>中声明该权限。当Android Package Manager安装了该应用程序时,用户要同意所有的权限要求才可以安装,如果用户不同意该请求,Package Manager会取消该app的安装。
下面所示就是在<user-permission>中获取用户字典Provider的读取许可:
<user-permission android:name=”android.permission.READ_USER_DICTIONARY”>
关于许可的更多详细信息,参见Security and Permissions指南。
Inserting, Updating, and Deleting Data
同样的方式,你要从provider中检索数据,你也需要利用provider客户端以及provider的ContentProvider的相互作用来修改数据。你可以调用ContentResolver的方法将参数传递给与之相关的ContentProvider。Provider和provider端会自动处理安全域进程间通信。
Inserting data
为了向provider中插入数据,你必须调用ContentResolver.insert()方法。该方法向provider插入一行新数据,并返回该数据的Content URI。下面代码片段展示了如何向User Dictionary Provider插入一个新的单词:
//Defines a new Uri object that receives theresult of the insertion
Uri mNewUri;
…
//Defines an object to contain the new values toinsert
ContentValues mNewValues = new ContentValues();
//Sets the values of each column and inserts theword. The arguments to the “put” //method are “column name” and “value”
mNewValues.put (UserDictionary.Words.APP_ID, “example.user”);
mNewValues.put (UserDictionary.Words.LOCALE,”en_US”);
mNewValues.put (UserDictionary.Words.WORD,”insert”);
mNewValues.put (UserDictionary.Words.FREQUENCY,”100”);
mNewUri = getContentResolver().insert(
UserDictionary.Word.CONTENT_URI,//the user dictionary content URI
mNewValues //the values to insert);
新建的一行数据会存放在ContentValues对象中,该对象与具有单行数据的cursor相似。该对象中的列不需要拥有相同类型的数据,且如果你不想声明任何值,可以使用方法ContentValues.putNull()将列设置为null。
上面的代码片段并没有添加_ID列,这是因为该列会被自动添加上。Provider会给添加的每一行分配独一无二的_ID值。通常,provider也会使用这个值作为表格的私有key。
ContentURI会在newUri中返回一个声明了的新添加的行,格式如下:
content://user_dictionary/words/<id_value>
<id_value>就是新行的_ID内容。大部分Provide都可以通过这个格式自动删除content URI并且在特定的行执行查询操作。
从返回的Uri对象中获取_ID值,只需要调用方法ContentUris.paredId()即可。
Updating Data
为了更新行中的数据,你可以使用带有更新值的ContentValues对象,就像之前做插入操作那样更新数据,且选择条件与之前使用query一致。在客户端上,你可以使用方法ContentResolver.update()。你只需要添加ContentValues对象到你需要更新的列上即可。如果你想清楚列中的内容,将值设置为null即可。
下面的代码片段将每行的locale值从”en”设置为null。返回值则是被更新值的行的数量。
//Defines an object to contain the updated values
ContentValues mUpdateValues = newContentValues();
//Defines selection criteria for the rows youwant to update
String mSelectionClause = userDictionary.Words.LOCALE + “LIKE ?”;
String[] mSelectionArgs = [“en_%”];
//Defines a variable to contain the number ofupdated rows
int mRowsUpdated = 0;
…
//Sets the updated values and updates theselected words.
mUpdateValues.putNull(UserDictionary.Words.LOCALE);
mRowsUpdated = getContentResolver().update(
UserDictionary.Words.CONTENT_URI, //the user dictionary content URI
mUpdateValues, //thecolumn to update
mSelectionClause, //the column toselect on
mSelectionArgs //the valueto compare to);
在调用ContentResolver.update()方法时你也要对用户输入进行审查。可以阅读文档Protecting against malicious input获取更多信息。
Deleting data
删除行与检索行数据类似:给你想删除的行声明选择条件然后客户端会返回删除的行数。下面的代码片段说明如何删除匹配”user”的行,该方法返回删除的行数。
//Defines selection criteria for the rows youwant to delete
String mSelectionClause =UserDictionary.Words.APP_ID +”LIKE ?”;
String [] mSelectionArgs = {“user”};
//Defines a variable to contain the number ofrows deleted
int mRowsDeleted = 0;
…
//Deletes the words that match the selectioncriteria
mRowsDeleted = getContentResolver().delete(
UserDictionary.Words.CONTENT_URI, //the user dictionary content URI
mSelectionClause, //thecolumn to select on
mSelectionArgs //thevalue to compare to);
在方法ContentResolver.delete()中你同时也需要做用户输入审查。更多关于输入审查的信息可以参考文档Protecting against malicious input.
Provider Data Types
ContentProvider可以提供许多不同类型的数据。UserDictionary Provider只能提供text,但是provider可以提供下面这些格式的数据:
● 整数(integer)
● 长整数(long integer)
● 浮点数 (floating point)
● Double类型 (long floating point)
另外一个provider常用的类型是Binary Large Object(BLOB),通常以64KB字节的数据实现。你可以通过查看Cursor的get方法就知道里面有多少可用类型数据。
Provider中每列殊绝的类型通常会列在provider的文件中。例如User Dictionary Provider的数据类型就在与之相关的文件,该文件的contract class就是UserDictionary.Words。(contract class在文档Contract Class中会有详细介绍)你可以用方法Cursor.getType()决定数据类型。
Provider同时也包含MIME数据类型。你可以使用MIME数据类型,只要你的app可以控制provider提供的MIME数据类型,或者根据MIME的数据类型选择你的设备上的一个app来控制MIME类型数据。当你使用的provider中包含复杂的数据结构或文件的时候,你是需要使用MIME类型的。例如,在ContactsProvider中ContactsContract.Data表格使用MIME类型标记储存在每一行的联系人数据。要获取每一个contentURI中的MIME相关数据,可以调用方法ContentResolver.getType()。
章节MIME Type Reference介绍MIME类型的语法和结构。
Alternative Forms of Provider Access
有一下可选择的三个形式在app中访问provider:
● Batch access(批量访问): 你可以通过方法ContentProviderOperation类创建一批访问方法,并用ContentResolver.applyBatch()实施。
● 异步query: 你应该在别的线程中执行query。其中一个方法是使用CursorLoader对象。例子可以参照Loaders文档。
● Data access via intents(通过intent传递数据): 尽管你不能直接通过intent向provider传递数据,你可以发送一个含有数据的intent给provider的应用,该应用是修改provider中数据的最佳工具。
Batch access
如果你需要大量插入行,或者使用同一个方法将行插入多个不同的表中,或普通情况下的跨线程执行一个事务,使用batch access都是最佳选择。
为了在“batch”模式下进入provider,你应该创建ContentProviderOperation对象数组,然后用方法ContentResolver.applyBatch()将它分派到content provider中。你将content provider的权限传递到该方法中而不是将特殊的content URI传递过去。这允许在数据中的每一个ContentProviderOperation对象对不同的表起作用。调用方法ContentResolver.applyBatch()返回一个array结果。
Contract类ContactsContract.RowContacts的描述包括一段能够显示batch插入的代码。在ContactAdder.java源文件中会有Contact管理者程序添加batch访问许可的例子。
Data access via intents
Intent可以提供间接访问content provider的通道。即使是你的app没有获得访问许可,用户也可以访问provider的数据,。或者是通过一个有访问许可的app返回的结果intent,或者是激活一个具有访问权限的app并允许用户通过它来操作。
Displayingdata using a helper app
如果你的app没有访问provider的权限,你可能需要通过一个intent在别的app中展示数据。例如,日历app接收一个ACTION_VIEW的intent,该intent显示特别的日期或事件。这就允许你在不创建自己UI的情况下显示日历信息。可以查看文档Calendar Provider获取更多信息。
你发送intent给的app并不一定需要与相关的provider有关系。例如,你可以从Content Provider中检索contact,然后发送包含了content URI的ACTION_VIEW的intent。
Getting access with temporary permission
如果你的app没有获取访问相应provider的正确权限,你可以通过发送intent到具有相应权限的app并从该app中返回的intent获取包含“URI”的权限。这些为了一个特殊contentURI的权限持续到activity接收后就会终止。App通过在返回的结果intent中设定如下Flag就有永久权限允许这些临时的权限:
Readpermission: FLAG_GRANT_READ_URI_PERMISSION
Writepermission: FLAG_GRANT_WRITE_UTI_PERMISSION
Note: 这些flag并不给予普通的访问provider的读或写的权限(该权限在content URI中)。该access仅仅授权给URI对象。
Provider在其manifest文件中的<provider>元素里使android:grantUriPermission标签就可以为content URI声明URI许可,在<provider>的子元素<grant-uri-permission>中也可以同样声明。URI的许可机制更多详情请见指引Securityand Permissions中的“URI Permission”章节。
例如,即使你没有READ_CONTACT许可,你也可以在Contacts Provider中检索一个contact的数据。例如你想要在该app中向你的联系人的生日当天发送简讯。与其要求获得可以获得所有联系信息的许可READ_CONTATCS,你可以让用户选择你的app将使用哪一个联系人的信息。为了达成这个目的,你可以遵循下面的步骤:
1. 你的app使用方法startActivityForResult()发送action为ACTION_PICK以及MIME类型“contacts”为CONTENT_ITEM_TYPE的intent。
2. 因为该intent匹配People app的“selection”activity中的intent过滤器,该activity会出现在前端
3. 在SelectionActivity中,用户选择一个联系人。当这个事件发生后,selection activity会调用setResult(resultcode, intent)方法创建一个intent并返回给你的app。该intent包含用户选择的联系人的content URI,以及“extras”flagFLAG_GRANT_READ_URI_PERMISSION。这些flag授权URI许可给你的app,你的app可以阅读由该contentURI指定的联系人数据。Selection activity接下来会调用finish()方法将控制权交回你的app
4. 你的activity返回到前台,然后系统会调用你的activity中的方法onActivityResult()。这个方法会获取到从People app的selection activity创建的resultintent。
5. 通过从结果intent中的content URI,你可以阅读Contacts Provider中的联系人数据,即使你没有在你的manifest文件中要求获取阅读权限。你可以从数据中拿到联系人的生日数据以及她/他的邮件地址,手机号码然后给她/他发送简讯
Using another application
一个简单的方法允许用户修改并没有获得权限的数据的方法是,激活一个有修改数据权限的app并让用户通过有权限的app对数据进行操作。
例如,日历app接收一个ACTION_INSERT的intent,这就意味着它允许你激活并使用它的插入UI。你可以在intent中添加“extra”数据,该数据会被app提前使用到UI上。因为复发性事件会有复杂的语法,所以向Calendar Provider插入数据的最好做法就是使用带有ACTION_INSERT的intent激活Calendar app并允许用户插入数据
Contract Classes
一个contract类声明了常量,该常量可以帮助app作用于contentURI,列名,intent action以及其他content provider的特征。Contract类并不自动包含provider,provider的开法者不得不声明provider并使他们对于别的developer是有效的。在android平台上的许多provider都在包android.privider中并与contract类有关。
例如,用户词典Provider有一个contract类UserDictionary包含contentURI以及联系人列表名。“Word”表的ContentURI被声明在在联系人的UserDictionary.Words.CONTENT_URI。UserDictionary.Words类同样也包含了联系人列名,例如一个queryprojection可以如下定义:
String[] mProjection={
UserDictionary.Words._ID,
UserDictionary.Words.WORD,
UserDictionary.Words.LOCALE
};
另一个Contacts Provider的contract类是ContactsContract。这个类的其中一个子类,ContactsContract.Intents.Insert,是一个包含了联系人intent和intent数据的contract类。
MIME Type Reference
ContentProvider可以返回标准的MIME媒体类型,或者是自定义的MIME类型字符串,或者两者都有。
MIME类型有如下格式
type/subtype(类型/子类型)
例如,一个已知类型为text/html的MIME类型具有text类型和html子类型。如果provider返回URI类型,这就意味着query使用URI将返回包含HTML标签的text。
普通MIME类型的string,也称为“vendor-specific”MIME类型,有更复杂的类型和子类型。类型值总是:vnd.android.dir;多行数据或单行数据,可能是vnd.android.cursor.item。
子类型是provider特有的。Android内置的provider通常有一个简单的子类型。例如,当Contacts app创造了一行电话号码后,它会如下设置该行的MIME类型:
vnd.android.cursor.item/phone_v2
注意子类型是简单的phone_v2。
别的provider开发者可能基于provider的权限以及表的名字来创建他们自己的子类型。例如,考虑创建一个包含列车时刻表的provider。该provider具有权限com.example.trains,同时它包含了表Line1,Line2和Line3。
其Line1 的content URI是:content://com.example.trains/Line1
provider返回的MIME类型是:vnd.android.cursor.dir/vnd.example.line1
在表Line2中的第五行的content URI是:content://com.example.trains/Line2/5
而provider返回的MIME类型是:vnd.android.item/vnd.example.line2
大部分content provider会为他们要使用的MIME类型声明contract类常量。Contacts Provider的contract类是ContactsContract.RawContacts。例如,为联系人的单独一行原始数据声明的MIME常量为CONTENT_ITEM_TYPE。
ContentURI的单独行声明则在Content URIs章节中有描述。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 500V,线性稳压器LDO ZCC2786A替代KP3310
产品描述 ZCC2786A是一款紧凑型无电感设计的离线式线性稳压器。ZCC2786A输出电压已 由内部设定为5V/3.3V/2.7V三个版本。ZCC2786A是一种简单可靠的获得偏置供 电的离线式电源解决方案。 ZCC2786A集成了650V功率MOSFET,启动控制电路,VDD电压控制电路,AC交流 信号同步检测电路…...
2024/4/17 6:24:16 - Fedora 22正式版:云系统、桌面和服务器大变革
Fedora Linux 22已经发布,除桌面版本更新外,真正的改进是在云系统和服务器方能的功能改进。在该版本后,Fedora将重回六个月的版本升级周期,下次的时间点大约在万圣节。Fedora 22是建立在Fedora 21的基础之上,仍然提供工作站(桌面)、服务器和云系统三种类型系统。在Fedor…...
2024/5/8 17:12:32 - 常见深度学习框架比较
常见的深度学习框架有 TensorFlow 、Caffe、Theano、Keras、PyTorch、MXNet等,如下图所示。这些深度学习框架被应用于计算机视觉、语音识别、自然语言处理与生物信息学等领域,并获取了极好的效果。下面将主要介绍当前深度学习领域影响力比较大的几个框架,内容出自书籍《深度…...
2024/5/8 12:37:43 - 简单工厂模式,工厂方法模式,抽象工厂模式(从放弃到入门)
简单工厂模式,工厂方法模式,抽象工厂模式(从放弃到入门)@(设计模式)工厂模式,很多讲设计模式的书中,工厂模式都是第一个讲的模式,因为其最简单。但是在实际开发中,工厂模式是非常常见的。在java开发中经常遇到一个类叫 xxxFactory,虽然不是所有带 Factory的类都是工厂…...
2024/5/8 14:22:54 - 软件实训:手把手写一个javaweb项目
前言: 三个星期的实训过去了大半,剩下的时间要开始搞实训项目,所以花点时间整理一下实训的收获。感谢何老师,讲得简练清晰,引人入胜。感谢相遇。 开发环境: IDE:Eclipse IDEA JDK:JDK8 DB:MySql5.5 服务器:tomcat-7 浏览器:谷歌chrom 实现功能: 1.用户登陆,通过查…...
2024/5/8 18:30:44 - Android Contacts 联系人源码分析
Android Contacts总览Contacts应用是由Google Android团队编写的Android原生应用。在应用层面上涉及到Contacts.apk, ContactProvider.apk。其他相关的在Framwork,以及framework与linux内核之间的SQLite.Contacts.apk只是界面层的逻辑,主要实现UI的流程。对于联系人的查询,存…...
2024/5/8 23:31:02 - 查看Oracle数据库所有的用户及表空间等
最直观的方法就是直接在pl/sql里查看 命令行如下: 查看所有用户:select * from all_users; 查看表空间:select tablespace_name from dba_tablespaces; 查看用户具有怎样的角色:select * from dba_role_privs where grantee=用户名; 查看某个角色包括哪些系统权限:select…...
2024/4/17 6:24:40 - 深度学习之数据增强(Python版)
对于深度学习拿到数据时,有时候样本数据太少,这时候就需要增加数据,可以利用数据增强来做,数据增强可以有效减少过拟合,更好地使模型适用于新的样本,目的是增强模型的泛化能力。 如何进行数据增强?比如拿到一张图片,可以通过随机裁剪,旋转、缩放和水平翻转等操作来生成…...
2024/5/8 21:55:52 - 40岁后学习编程是否太晚了?7点技巧让学习变得轻松有趣
很多人经常会问:“在什么时候学习编程才合适?”,甚至有很多在职场中打滚了多年的人也会有这样的疑问。他们当中有很多人都想把自己的专业跳到编程专业,原因是多方面的,其中包括了他们对自动化的畏惧,而这个问题在40岁以上的人群中变得更具针对性。编程是一项很花脑力、精…...
2024/4/17 6:25:46 - ccbpm工作流引擎是如何支持多种流程模式的
前言: 在BPM领域支持流程运转的理论模型有多种,有的21种、28种,32种。每种模式都代表了这种模式的理论设计者研究者的人员主张、思想。这些模式尽可能的,完全去覆盖到现实生产、工作、应用上的流程流转规则。但是任何领域都有自己未探索到的流程运转可能,如果说自己的理论…...
2024/5/9 5:19:39 - 各种设计模式的UML类图
一、单一职责原则 就一个类而言,应该仅有一个引起它变化的原因。 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱他的设计,当变化发生时,设计会遭受到意想不到的破坏…...
2024/5/8 19:36:36 - 内容提供者基础 Content Provider Basics——翻译自developer.android.com
#内容提供者基础 Content Provider Basics content provicer 管理着中心数据仓库的访问。一个provider是Android的应用的一部分,它可以提供数据工作的UI。 然而,content provider基本都是被其他的应用访问,使用一个provider客户端对象来访问provider。provider和provider cl…...
2024/5/9 0:13:23 - 《QQ西游》,最接近神的一个
《QQ西游》,最接近神的一个久不搞魔兽,最近心血来潮,找了几个新网游玩。第一次听说《QQ西游》,是在去年“腾讯嘉年华”上,印象中大幅的宣传海报上赫然写着“娶个妖精做老婆”,走非清纯路线的女主角戴唇钉,第一感觉是这游戏定位为90后为主的年轻玩家群体。最近几天这游戏…...
2024/4/19 0:23:51 - QT项目卡死在Reading Project
在打开项目时,或做出一些修改后重新编译会出现这些问题; 解决方式: 先强行关掉QT,进入项目目录下,删除后缀为.user和.user.xxxx的文件;然后重新打开即可...
2024/3/31 7:27:48 - 一步步学习Linux多任务编程
系统调用01、什么是系统调用?02、Linux系统调用之I/O操作(文件操作)03、文件描述符的复制:dup(), dup2()多进程实现多任务04、进程的介绍05、Linux可执行文件结构与进程结构06、多进程实现多任务(一):fork()07、多进程实现多任务(二):vfork()08、进程的控制:结束进程…...
2024/4/18 23:58:10 - 设计模式之UML类图该怎么画
关于可维护、可复用、可扩展、灵活性好的理解: 生活中:印刷术和活字印刷,当需要对某些内容修改时,印刷术只要有一丁点变化,就需要重头再来;而活字印刷只需要进行部分修改即可。 可维护:只更改要更改的内容; 可复用:之前的内容并非用完就无用,后面仍可使用; 可扩展:…...
2024/4/17 6:27:10 - leetcode - 贪心算法(一)
先导:为什么要做leetcode?现实收益角度看,无论你是算法、数据、前端、后端工程师等等,目前大厂互联网公司面试肯定要考察的,国外google和facebook等等更盛 。都是从leetcode或者类似的网站上出题,如果不熟练,一面都过不了,与心仪的公司失之交臂。我认为它的价值在哪呢?…...
2024/3/31 20:43:46 - 2018年最新Python的人工智能深度学习框架Tensorflow 入门教程+源码
Python的人工智能深度学习框架Tensorflow 入门视频教程+源码下载地址:百度网盘...
2024/4/24 13:47:09 - 【翻译】(9-补丁2)电话簿提供者
【翻译】(9-补丁2)电话簿提供者see http://developer.android.com/guide/topics/providers/contacts-provider.html原文见 http://developer.android.com/guide/topics/providers/contacts-provider.html-------------------------------Contacts Provider电话簿(注:联系人,…...
2024/5/6 7:15:26 - 设计模式之工厂模式(简单工厂,工厂方法,抽象工厂)
此篇文章介绍工厂模式包含3种:简单工厂,工厂方法,抽象工厂。 下面一一介绍 背景:开一家比萨店,店子位于对象村 简单工厂: 进行初步设计,你可能进行如下设计现在,店子扩张,需要更多的比萨类型。。。修改设计: 通过传递一个“type”,来决定创建这个比萨问题有来了:需要…...
2024/4/17 6:25:34
最新文章
- 阿里云VOD视频点播流程(2)
二、视频点播 1、入门代码 基于OSS原生SDK上传 ,参考文档:https://help.aliyun.com/zh/vod/user-guide/upload-media-files-by-using-oss-sdks?spma2c4g.11186623.0.0.1f02273fj4lxNJ 视频点播面向开发者提供了丰富的上传方式,其中上传SDK&…...
2024/5/9 6:59:48 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/7 10:36:02 - YOLOv9架构图分享
YOLOv9是YOLO (You Only Look Once)系列实时目标检测系统的最新迭代。它建立在以前的版本之上,结合了深度学习技术和架构设计的进步,以在目标检测任务中实现卓越的性能。通过将可编程梯度信息(PGI)概念与广义ELAN (GELAN)架构相结合,YOLOv9在…...
2024/5/6 12:36:11 - 文件系统 FTP Ubuntu 安装入门介绍
FTP 环境: Ubuntu 14.04 blog zh_CN ubuntu14.04 Install 全新安装:apt-get install vsftpd 重新安装:apt-get --reinstall install vsftpd 卸载并清除配置文件:apt-get --purge remove vsftpd Start & Restart $ service vsftpd start $ se…...
2024/5/7 5:05:20 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/8 6:01:22 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/7 9:45:25 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/9 4:20:59 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/7 11:36:39 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/6 1:40:42 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/8 20:48:49 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/7 9:26:26 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/8 19:33:07 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/8 20:38:49 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/6 21:42:42 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57