- ไวยากรณ์:
-
<provider android:authorities="list" android:directBootAware=["true" | "false"] android:enabled=["true" | "false"] android:exported=["true" | "false"] android:grantUriPermissions=["true" | "false"] android:icon="drawable resource" android:initOrder="integer" android:label="string resource" android:multiprocess=["true" | "false"] android:name="string" android:permission="string" android:process="string" android:readPermission="string" android:syncable=["true" | "false"] android:writePermission="string" > ... </provider>
- ที่อยู่ใน:
-
<application>
- สามารถมีข้อมูลต่อไปนี้
<meta-data>
<grant-uri-permission>
<intent-filter>
<path-permission>
- description:
-
ประกาศคอมโพเนนต์ผู้ให้บริการเนื้อหา ผู้ให้บริการเนื้อหาเป็นคลาสย่อยของ
ContentProvider
ที่ให้การเข้าถึงข้อมูลที่มีโครงสร้างที่จัดการโดย แอปพลิเคชัน ผู้ให้บริการเนื้อหาทั้งหมดในแอปพลิเคชันของคุณต้องได้รับการกำหนดไว้ใน องค์ประกอบ<provider>
ในไฟล์ Manifest มิฉะนั้น ระบบจะไม่ทราบ ไม่ใช้อินเทอร์เน็ตประกาศเฉพาะผู้ให้บริการเนื้อหาที่เป็นส่วนหนึ่งของแอปพลิเคชันของคุณ อย่าประกาศผู้ให้บริการเนื้อหาใน กับแอปพลิเคชันอื่นๆ ที่คุณใช้ในแอปพลิเคชันของคุณ
ระบบ Android จัดเก็บการอ้างอิงไปยังผู้ให้บริการเนื้อหาตามหน่วยงาน ซึ่งเป็นส่วนหนึ่งของ URI เนื้อหาของผู้ให้บริการ ตัวอย่างเช่น สมมติว่าคุณต้องการ เข้าถึงผู้ให้บริการเนื้อหาที่เก็บข้อมูลเกี่ยวกับผู้เชี่ยวชาญด้านการดูแลสุขภาพ สิ่งต้องทำ คุณเรียกเมธอด
ContentResolver.query()
ซึ่งใช้ URI ที่ระบุผู้ให้บริการและอาร์กิวเมนต์อื่นๆcontent://com.example.project.healthcareprovider/nurses/rn
รูปแบบ
content:
ระบุ URI เป็น URI เนื้อหาที่ชี้ไปยัง ผู้ให้บริการเนื้อหา Android หน่วยงานcom.example.project.healthcareprovider
ระบุตัวตนผู้ให้บริการ ระบบ Android จะค้นหาสิทธิ์ในรายชื่อผู้ให้บริการที่รู้จักและหน่วยงานของผู้ให้บริการ สตริงย่อยnurses/rn
คือเส้นทางที่ผู้ให้บริการเนื้อหาใช้ เพื่อระบุข้อมูลผู้ให้บริการชุดย่อยเมื่อคุณกำหนดผู้ให้บริการในองค์ประกอบ
<provider>
คุณจะสามารถ ไม่รวมรูปแบบหรือเส้นทางในอาร์กิวเมนต์android:name
ใส่เฉพาะ ที่เหมาะสมสำหรับข้อมูลเกี่ยวกับการใช้และพัฒนาผู้ให้บริการเนื้อหา โปรดดู ผู้ให้บริการเนื้อหา
- ดังนี้
-
android:authorities
-
รายชื่อของหน่วยงาน URI อย่างน้อย 1 รายการที่ระบุข้อมูลที่ผู้ให้บริการเนื้อหามีให้
ระบุหน่วยงานหลายรายการโดยคั่นชื่อด้วยเครื่องหมายเซมิโคลอน
เพื่อหลีกเลี่ยงข้อขัดแย้ง ให้ใช้รูปแบบการตั้งชื่อแบบ Java สำหรับชื่อหน่วยงาน
เช่น
com.example.provider.cartoonprovider
โดยปกติจะเป็นชื่อ ของคลาสย่อยContentProvider
ที่ใช้ผู้ให้บริการไม่มีค่าเริ่มต้น ต้องระบุหน่วยงานอย่างน้อยหนึ่งแห่ง
android:enabled
- ระบบสร้างอินสแตนซ์ผู้ให้บริการเนื้อหาได้หรือไม่ ตอนนี้
"true"
หากทำได้ และ"false"
หากทำได้ ค่าเริ่มต้น มีค่า"true"
องค์ประกอบ
<application>
ของตัวเอง แอตทริบิวต์enabled
ที่ใช้กับแอตทริบิวต์ทั้งหมด คอมโพเนนต์ของแอปพลิเคชัน รวมถึงผู้ให้บริการเนื้อหา<application>
และ<provider>
แอตทริบิวต์ทั้งคู่ต้องเป็น"true"
เพราะทั้งสอง ตามค่าเริ่มต้น เพื่อเปิดใช้ผู้ให้บริการเนื้อหา หากข้อใดข้อหนึ่งคือ"false"
ปิดใช้ผู้ให้บริการอยู่ ไม่สามารถสร้างอินสแตนซ์ได้ android:directBootAware
ผู้ให้บริการเนื้อหารับรู้การเปิดเครื่องโดยตรงหรือไม่ กล่าวคือ ว่าจะทำงานก่อนที่ผู้ใช้จะปลดล็อกอุปกรณ์ได้หรือไม่
หมายเหตุ: ระหว่าง Direct Boot ซึ่งเป็นเนื้อหา ของผู้ให้บริการในแอปพลิเคชันของคุณ จะสามารถเข้าถึงเฉพาะข้อมูลที่เก็บไว้ใน พื้นที่เก็บข้อมูลที่ปกป้องอุปกรณ์
ค่าเริ่มต้นคือ
"false"
android:exported
-
ผู้ให้บริการเนื้อหามีให้ใช้แอปพลิเคชันอื่นหรือไม่
-
"true"
: ผู้ให้บริการพร้อมใช้งานสำหรับแอปพลิเคชันอื่น ทุกแอปพลิเคชันสามารถ ใช้ URI เนื้อหาของผู้ให้บริการเพื่อเข้าถึง URI ดังกล่าว โดยขึ้นอยู่กับสิทธิ์ที่ระบุไว้สำหรับ กับผู้ให้บริการ -
"false"
: ผู้ให้บริการไม่พร้อมใช้งานสำหรับแอปพลิเคชันอื่น ตั้งค่าandroid:exported="false"
เพื่อจำกัดการเข้าถึงผู้ให้บริการสำหรับ แอปพลิเคชัน เฉพาะแอปพลิเคชันที่มีรหัสผู้ใช้ (UID) เดียวกันกับผู้ให้บริการ หรือ แอปพลิเคชันที่ได้รับสิทธิ์ชั่วคราว ผ่านทางandroid:grantUriPermissions
เข้าถึงได้
เนื่องจากแอตทริบิวต์นี้เริ่มใช้ใน API ระดับ 17 อุปกรณ์ทั้งหมดที่ใช้ระดับ API 16 และต่ำกว่าจะทํางานเสมือนว่าแอตทริบิวต์นี้ตั้งค่าไว้เป็น
"true"
หากตั้งค่าไว้android:targetSdkVersion
ค่าเริ่มต้นคือ"false"
สำหรับอุปกรณ์ที่ใช้ API ระดับ 17 ขึ้นไปคุณยังสามารถตั้งค่า
android:exported="false"
และยังคงจำกัดการเข้าถึง โดยการตั้งค่าสิทธิ์ที่มี วันที่permission
-
android:grantUriPermissions
- ไม่ว่าจะเป็นบุคคลที่โดยปกติไม่มีสิทธิ์
การเข้าถึงข้อมูลของผู้ให้บริการเนื้อหา
สามารถให้สิทธิ์ดำเนินการดังกล่าวได้
เพื่อข้ามการจำกัดที่กำหนดโดย
readPermission
,writePermission
,permission
และexported
หากให้สิทธิ์ได้จะเป็น
"true"
และเป็น"false"
หากให้สิทธิ์ไม่ได้ หากเป็น"true"
คุณจะให้สิทธิ์กับเนื้อหาใดก็ได้ ข้อมูลของผู้ให้บริการ หากเป็น"false"
จะอนุญาตเฉพาะ กับชุดย่อยของข้อมูลที่แสดงใน<grant-uri-permission>
องค์ประกอบย่อย หากมี ค่าเริ่มต้นคือ"false"
การให้สิทธิ์เป็นวิธีการให้คอมโพเนนต์ของแอปพลิเคชันแบบครั้งเดียว การเข้าถึงข้อมูลที่มีการป้องกันโดยสิทธิ์ เช่น เมื่ออีเมล มีไฟล์แนบ แอปพลิเคชันอีเมลอาจเรียกใช้ ผู้ชมที่เหมาะสมในการเปิด แม้ผู้ชมจะไม่ได้มี สิทธิ์ในการดูข้อมูลของผู้ให้บริการเนื้อหาทั้งหมด
ในกรณีดังกล่าว ระบบจะได้รับสิทธิ์จาก
FLAG_GRANT_READ_URI_PERMISSION
และFLAG_GRANT_WRITE_URI_PERMISSION
ในออบเจ็กต์Intent
ที่เปิดใช้งานคอมโพเนนต์ ตัวอย่างเช่น พารามิเตอร์ แอปพลิเคชันอีเมลอาจใส่FLAG_GRANT_READ_URI_PERMISSION
ไว้ใน ผ่านIntent
ไปยังContext.startActivity()
สิทธิ์เป็นแบบเฉพาะเจาะจง ไปยัง URI ในIntent
หากคุณเปิดใช้ฟีเจอร์นี้ ไม่ว่าจะโดยการตั้งค่าแอตทริบิวต์นี้เป็น
"true"
หรือการกำหนด<grant-uri-permission>
องค์ประกอบย่อย, การเรียกContext.revokeUriPermission()
เมื่อ URI ที่ครอบคลุมถูกลบออกจากผู้ให้บริการดู
<grant-uri-permission>
เพิ่มเติม android:icon
- ไอคอนที่แสดงถึงผู้ให้บริการเนื้อหา
แอตทริบิวต์นี้ตั้งเป็นการอ้างอิงทรัพยากรที่ถอนออกได้ซึ่งมี
คำจำกัดความของรูปภาพ หากไม่ได้ตั้งค่าไว้ ไอคอนที่ระบุไว้สำหรับแอปพลิเคชัน
จะใช้จำนวนเต็มแทน ดูข้อมูลเพิ่มเติมได้ที่
<application>
แอตทริบิวต์icon
ขององค์ประกอบ android:initOrder
- ลำดับการเริ่มต้นผู้ให้บริการเนื้อหา เมื่อเทียบกับผู้ให้บริการเนื้อหารายอื่นที่โฮสต์ด้วยกระบวนการเดียวกัน เมื่อมีทรัพยากร Dependency ระหว่างผู้ให้บริการเนื้อหา แอตทริบิวต์ของแต่ละชุด ให้แน่ใจว่าแอตทริบิวต์เหล่านั้นสร้างขึ้นตามลำดับ ที่จำเป็นสำหรับทรัพยากร Dependency เหล่านี้ ค่าเป็นจำนวนเต็ม โดยตัวเลขที่สูงกว่าจะถูกเริ่มต้นก่อน
android:label
- ป้ายกำกับที่ผู้ใช้อ่านได้สำหรับเนื้อหาที่ให้ไว้
หากไม่ได้ตั้งค่าแอตทริบิวต์นี้ ป้ายกำกับที่ตั้งไว้สำหรับแอปพลิเคชันโดยรวมจะเป็น
ใช้แทน ดูข้อมูลเพิ่มเติมได้ที่องค์ประกอบ
<application>
label
โดยปกติ ป้ายกำกับจะถูกตั้งค่าเป็นการอ้างอิงไปยังทรัพยากรสตริง ดังนั้น สามารถแปลได้เหมือนกับสตริงอื่นๆ ในอินเทอร์เฟซผู้ใช้ แต่เพื่อความสะดวก ในระหว่างที่คุณพัฒนาแอปพลิเคชัน ยังสามารถตั้งค่าเป็นสตริงดิบได้
android:multiprocess
- หากแอปทำงานในหลายกระบวนการ แอตทริบิวต์นี้จะระบุว่า
อินสแตนซ์ของผู้ให้บริการเนื้อหาหลายอินสแตนซ์จะถูกสร้าง หากเป็น
"true"
กระบวนการของแอปแต่ละรายการจะมีออบเจ็กต์ผู้ให้บริการเนื้อหาของตัวเอง ถ้า"false"
กระบวนการของแอปจะแชร์ออบเจ็กต์ผู้ให้บริการเนื้อหาเพียง 1 รายการเท่านั้น ค่าเริ่มต้นคือ"false"
การตั้งค่าแฟล็กนี้เป็น
"true"
จะช่วยปรับปรุงประสิทธิภาพโดยลด ค่าใช้จ่ายของการสื่อสารระหว่างโปรเซส แต่จะช่วยเพิ่มหน่วยความจำ ของแต่ละกระบวนการ android:name
- ชื่อคลาสที่ใช้งานผู้ให้บริการเนื้อหา คลาสย่อยของ
ContentProvider
ซึ่งมักจะเป็น ชื่อชั้นเรียน เช่น"com.example.project.TransportationProvider"
แต่ถ้าอักขระตัวแรกของชื่อเป็นเครื่องหมายจุด จะเพิ่มค่าต่อท้ายชื่อแพ็กเกจที่ระบุไว้ใน องค์ประกอบ<manifest>
ไม่มีค่าเริ่มต้น ต้องระบุชื่อ
android:permission
- ชื่อของสิทธิ์ที่ลูกค้าต้องอ่านหรือเขียน
ข้อมูลของผู้ให้บริการเนื้อหา แอตทริบิวต์นี้เป็นวิธีที่สะดวกในการตั้งค่า
สิทธิ์เดียวสำหรับทั้งการอ่านและการเขียน อย่างไรก็ตาม
readPermission
, แอตทริบิวต์writePermission
และgrantUriPermissions
จะมีลำดับความสำคัญเหนือกว่า มากกว่าอันนี้หาก
readPermission
มีการตั้งค่าเช่นกัน ซึ่งจะควบคุมการเข้าถึงในการค้นหาผู้ให้บริการเนื้อหา หากมีการตั้งค่าแอตทริบิวต์writePermission
ซึ่งควบคุมสิทธิ์เข้าถึงเพื่อแก้ไขข้อมูลของผู้ให้บริการดูข้อมูลเพิ่มเติมเกี่ยวกับสิทธิ์ได้ที่ สิทธิ์ ในภาพรวมไฟล์ Manifest ของแอปและ เคล็ดลับความปลอดภัย
android:process
- ชื่อของกระบวนการที่ผู้ให้บริการเนื้อหาเรียกใช้ โดยทั่วไป
คอมโพเนนต์ทั้งหมดของแอปพลิเคชันจะทำงานในกระบวนการเริ่มต้นที่สร้างขึ้นสำหรับ
แอปพลิเคชัน มีชื่อเดียวกับแพ็กเกจแอปพลิเคชัน
ขององค์ประกอบ
<application>
วันที่process
สามารถตั้งค่าแอตทริบิวต์ ค่าเริ่มต้นสำหรับทุกคอมโพเนนต์ แต่คอมโพเนนต์แต่ละอย่างสามารถแทนที่ค่าเริ่มต้น ด้วยแอตทริบิวต์process
ของตัวเองเพื่อ ช่วยให้คุณกระจายข้อมูล การใช้งานในหลายกระบวนการหากชื่อที่กำหนดให้กับแอตทริบิวต์นี้เริ่มต้นด้วยโคลอน (
:
) ซึ่งเป็นแบบส่วนตัวสำหรับแอปพลิเคชัน จะสร้างขึ้นเมื่อจำเป็น และ กิจกรรมจะทำงานในกระบวนการนั้นหากชื่อกระบวนการเริ่มต้นด้วยอักขระตัวพิมพ์เล็ก กิจกรรมจะทำงาน ในกระบวนการส่วนกลางของชื่อนั้น หากชื่อนั้นได้รับอนุญาตให้ดำเนินการดังกล่าว ทำให้คอมโพเนนต์ต่างๆ ในแอปพลิเคชันต่างๆ สามารถแบ่งปันกระบวนการได้โดย การใช้ทรัพยากร
android:readPermission
สิทธิ์ที่ลูกค้าต้องใช้เพื่อค้นหาผู้ให้บริการเนื้อหา
ในกรณีที่ผู้ให้บริการตั้งค่า
android:grantUriPermissions
เป็น"true"
หรือหากไคลเอ็นต์ที่ระบุตรงกับเงื่อนไขของ<grant-uri-permission>
ไคลเอ็นต์จะได้รับสิทธิ์การอ่านเนื้อหาชั่วคราว ข้อมูลของผู้ให้บริการรวมถึงดู
permission
และwritePermission
android:syncable
- ข้อมูลที่อยู่ในการควบคุมของผู้ให้บริการเนื้อหาหรือไม่
สามารถซิงค์กับข้อมูลบนเซิร์ฟเวอร์ได้ เป็น
"true"
หากทำได้ และ"false"
หากทำได้ android:writePermission
สิทธิ์ที่ลูกค้าต้องทำการเปลี่ยนแปลงข้อมูล ควบคุมโดยผู้ให้บริการเนื้อหา
ในกรณีที่ผู้ให้บริการตั้งค่า
android:grantUriPermissions
เป็น"true"
หรือหากไคลเอ็นต์ที่ระบุตรงกับเงื่อนไขของ<grant-uri-permission>
ไคลเอ็นต์จะได้รับสิทธิ์การเขียนชั่วคราวเพื่อแก้ไขเนื้อหา ข้อมูลของผู้ให้บริการรวมถึงดู
permission
และreadPermission
- เปิดตัวใน
- API ระดับ 1
- ดูเพิ่มเติม
- ผู้ให้บริการเนื้อหา
ตัวอย่างเนื้อหาและโค้ดในหน้าเว็บนี้ขึ้นอยู่กับใบอนุญาตที่อธิบายไว้ในใบอนุญาตการใช้เนื้อหา Java และ OpenJDK เป็นเครื่องหมายการค้าหรือเครื่องหมายการค้าจดทะเบียนของ Oracle และ/หรือบริษัทในเครือ
อัปเดตล่าสุด 2024-08-22 UTC
[{
"type": "thumb-down",
"id": "missingTheInformationINeed",
"label":"ไม่มีข้อมูลที่ฉันต้องการ"
},{
"type": "thumb-down",
"id": "tooComplicatedTooManySteps",
"label":"ซับซ้อนเกินไป/มีหลายขั้นตอนมากเกินไป"
},{
"type": "thumb-down",
"id": "outOfDate",
"label":"ล้าสมัย"
},{
"type": "thumb-down",
"id": "translationIssue",
"label":"ปัญหาเกี่ยวกับการแปล"
},{
"type": "thumb-down",
"id": "samplesCodeIssue",
"label":"ตัวอย่าง/ปัญหาเกี่ยวกับโค้ด"
},{
"type": "thumb-down",
"id": "otherDown",
"label":"อื่นๆ"
}]
[{
"type": "thumb-up",
"id": "easyToUnderstand",
"label":"เข้าใจง่าย"
},{
"type": "thumb-up",
"id": "solvedMyProblem",
"label":"แก้ปัญหาของฉันได้"
},{
"type": "thumb-up",
"id": "otherUp",
"label":"อื่นๆ"
}]
{
"lastModified": "อัปเดตล่าสุด 2024-08-22 UTC",
"confidential": False
}