Kivy 使用预填充的联系人字段启动 android 意图

Posted

技术标签:

【中文标题】Kivy 使用预填充的联系人字段启动 android 意图【英文标题】:Kivy start android intent with pre-filled contact fields 【发布时间】:2015-11-06 10:25:13 【问题描述】:

我想启动一个 android 添加联系人活动。但我也想启动联系人的意图插入操作。我的代码有什么问题。

我只是想使用已添加的电话和号码等预填充数据开始添加联系人活动。

import kivy

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from jnius import cast
from jnius import autoclass
PythonActivity = autoclass('org.renpy.android.PythonActivity')
Intent = autoclass('android.content.Intent')
Uri = autoclass('android.net.Uri')
Intents = autoclass("android.provider.ContactsContract$Intents")
ContactsContract = autoclass("android.provider.ContactsContract")
Contacts = autoclass("android.provider.ContactsContract$Contacts")

class Main(FloatLayout):
    def go_site(self):
        # create the intent
        '''
        intent = Intent()
        intent.setAction(Intent.ACTION_INSERT)
        intent.setData(Uri.parse("content://contacts/people/"))

        #############################################################

        intent = Intent()
        intent.setAction(Intent.ACTION_INSERT_OR_EDIT)
        intent.setType(Contacts.CONTENT_ITEM_TYPE)
        '''


        intent =  Intent()
        intent.setAction(Intents.Insert.ACTION)
        intent.setType(ContactsContract.RawContacts.CONTENT_TYPE)
        #intent.putExtra(Intents.Insert.EMAIL, "")



        # PythonActivity.mActivity is the instance of the current Activity
        # BUT, startActivity is a method from the Activity class, not from our PythonActivity.
        # We need to cast our class into an activity and use it

        currentActivity = cast('android.app.Activity', PythonActivity.mActivity)
        currentActivity.startActivity(intent)



class MainApp(App):

    def on_pause(self):
        # Here you can save data if needed
        return True

    def on_resume(self):

        # Here you can check if any data needs replacing (usually nothing)
        pass
    def build(self):
        return Main()         
if __name__ == '__main__':
    MainApp().run()

【问题讨论】:

在 Zarah 的评论链接中找到答案:***.com/questions/1895206/… 【参考方案1】:

Insert 是一个嵌套类。您需要使用 pyjnius 嵌套类语法。

这行得通:

Intent = autoclass('android.content.Intent')
Uri = autoclass('android.net.Uri')
Intents = autoclass("android.provider.ContactsContract$Intents")
Insert = autoclass("android.provider.ContactsContract$Intents$Insert")
ContactsContract = autoclass("android.provider.ContactsContract")
Contacts = autoclass("android.provider.ContactsContract$Contacts")

class Main(FloatLayout):
    def go_site(self):
        intent = Intent()
        intent.setAction(Intent.ACTION_INSERT_OR_EDIT)
        intent.setType(Contacts.CONTENT_ITEM_TYPE)
        intent.putExtra(Insert.NAME, "The Name")
        intent.putExtra(Insert.PHONE, "The Phone")
        intent.putExtra(Insert.COMPANY, "The Company")

        currentActivity = cast('android.app.Activity', PythonActivity.mActivity)
        currentActivity.startActivity(intent)

【讨论】:

这在打开时有效,但字段仍然为空。

以上是关于Kivy 使用预填充的联系人字段启动 android 意图的主要内容,如果未能解决你的问题,请参考以下文章

由 buildozer 构建的 Kivy apk 在显示预启动屏幕后很快崩溃

如何使用jquery预填充字段

使用 Javascript 预填充日期输入字段

使用预“查找”中间件填充多个字段

使用预“查找”中间件填充多个字段

预填充的 html 字段中的引号