如何正确获取电流activity?

How to get current activity correctly?

我需要访问我的应用程序的当前 activity。我检查了 this official code

如果我按照文档所述使用下面的代码:

PythonActivity = autoclass('org.renpy.android.PythonActivity')

我无法访问 activity 并且出现 returns 错误。所以在搜索之后我发现了这个:

PythonActivity = autoclass('org.kivy.android.PythonActivity')

下面有2个函数。第一个是像在文档中一样打开网络浏览器 IT WORKS:

from jnius import cast
from jnius import autoclass
PythonActivity = autoclass('org.kivy.android.PythonActivity')
Intent = autoclass('android.content.Intent')
Uri = autoclass('android.net.Uri')
intent = Intent()
intent.setAction(Intent.ACTION_VIEW)
intent.setData(Uri.parse('http://kivy.org'))
currentActivity = cast('android.app.Activity', PythonActivity.mActivity)
currentActivity.startActivity(intent)

现在我需要为我自己的脚本重新编码。我想将新联系人添加到联系人。我获得了 'WRITE_CONTACTS' 的许可。 在buildozer.spec:

android.permissions = WRITE_CONTACTS

但是我自己的脚本returns我出错了。我的函数:

from jnius import autoclass,cast
PythonActivity=autoclass('org.kivy.android.PythonActivity')
Intent = autoclass('android.content.Intent')
JS=autoclass('java.lang.String')
intent=Intent()
intent.setAction(Intent.ACTION_INSERT)
intent.setType('ContactsContract.RawContacts.CONTENT_TYPE')
intent.putExtra('ContactsContract.Intents.Insert.NAME',JS('Example Name'))
intent.putExtra('ContactsContract.Intents.Insert.PHONE',JS('7777777777'))
currentActivity=cast('android.app.Activity',PythonActivity.mActivity)
currentActivity.startActivity(intent)

日志:

jnius.jnius.JavaException: JVM exception occurred: No Activity found to handle Intent { typ=ContactsContract.RawContacts.CONTENT_TYPE (has extras) } android.content.ActivityNotFoundException

我不知道这个错误是因为 activity 还是我选错了类型。如果有人帮我处理这个问题,我会很高兴。像这样的内容在媒体上是很少的。所以我希望像这个主题一样让人们像我一样快速学习。

我不知道 Python 语法,但我可以告诉你问题出在哪里:

您缺少 Intent 操作。您需要将 Intent 中的 ACTION 设置为 ContactsContract.Intents.Insert.ACTION(具有字符串值 "android.intent.action.INSERT"

此外,您似乎发送的是 Android 常量名称 而不是这些东西的实际 字符串值 ,例如:

你这样做: intent.setType('ContactsContract.RawContacts.CONTENT_TYPE')

Intent 中的 type 设置为字符串值 "ContactsContract.RawContacts.CONTENT_TYPE",您可以在此处查看:

jnius.jnius.JavaException: JVM exception occurred: No Activity found to handle Intent { typ=ContactsContract.RawContacts.CONTENT_TYPE (has extras) } android.content.ActivityNotFoundException

type 需要设置为 Android 常量 ContactsContract.RawContacts.CONTENT_TYPE,其字符串值为 "vnd.android.cursor.dir/raw_contact"

如我所说,我不懂 Python 语法,但您可能需要这样做:

intent=Intent()
intent.setAction(ContactsContract.Intents.Insert.ACTION)
intent.setType(ContactsContract.RawContacts.CONTENT_TYPE)

或者,如果 Python 支持它,Intent 有一个将 ACTION 作为参数的构造函数,所以这也可能有效:

intent=Intent(ContactsContract.Intents.Insert.ACTION)
intent.setType(ContactsContract.RawContacts.CONTENT_TYPE)

让我知道这是否有意义。

最后,我找到了访问活动和获取联系人数据的解决方案。

正确访问PythonActivity:

PythonActivity = autoclass("org.kivy.android.PythonActivity")

正在访问 Contacts Java Class:

Contacts = autoclass("android.provider.ContactsContract$Contacts")

访问ContactsContract.CommonDataKinds.PhoneJavaClass(相同):

Kinds = autoclass("android.provider.ContactsContract$CommonDataKinds$Phone")

正在创建 getContentResolver()

cr = PythonActivity.mActivity.getContentResolver()

现在我们需要创建 2 个查询。首先,我们要找到 ID 并需要在第二个查询中使用它来找到相等的 NUMBER。还需要检查 联系人是否也有 phone 号码?。之后我们可以循环第二个查询来查找数字:

name_number_dict= {}   # Name:Number  # Change as you wish..
while (que1.moveToNext()):  #Query 1 Loop
    if que1.getString(que1.getColumnIndex(Contacts.HAS_PHONE_NUMBER)):  #If has number
        que2 = cr.query(Kinds.CONTENT_URI, None, Kinds.CONTACT_ID + " = " + que1.getString(que1.getColumnIndex(CONTACTS_ID)), None, None)  #Query 2 Loop
        while (que2.moveToNext()):
            name_number_dict[que1.getString(que1.getColumnIndex(Contacts.DISPLAY_NAME))] = que2.getString(que2.getColumnIndex(Kinds.NUMBER)  # Get datas and put in dic.

如果需要检查查询的所有ColumnNames,使用query1.getColumnNames() >> Referance

希望对需要在Python>Kivy 应用程序中使用它的人有所帮助..