如何正确获取电流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.Phone
JavaClass(相同):
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 应用程序中使用它的人有所帮助..
我需要访问我的应用程序的当前 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.Phone
JavaClass(相同):
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 应用程序中使用它的人有所帮助..