{"id":20127666,"url":"https://github.com/imangazalievm/scripto","last_synced_at":"2026-04-05T17:35:35.536Z","repository":{"id":82065246,"uuid":"63964349","full_name":"ImangazalievM/Scripto","owner":"ImangazalievM","description":"Android bridge for sending messages between Java and JavaScript in WebView.","archived":false,"fork":false,"pushed_at":"2019-10-02T10:46:57.000Z","size":233,"stargazers_count":267,"open_issues_count":0,"forks_count":27,"subscribers_count":11,"default_branch":"master","last_synced_at":"2025-04-11T22:37:57.648Z","etag":null,"topics":["android","java","java-interface","javascript","js-interface","scripto"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ImangazalievM.png","metadata":{"files":{"readme":"README-RU.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2016-07-22T15:35:55.000Z","updated_at":"2024-09-27T17:20:55.000Z","dependencies_parsed_at":null,"dependency_job_id":"9412f01e-eedc-4ce0-9e81-5f0be7fb14ac","html_url":"https://github.com/ImangazalievM/Scripto","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ImangazalievM%2FScripto","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ImangazalievM%2FScripto/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ImangazalievM%2FScripto/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ImangazalievM%2FScripto/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ImangazalievM","download_url":"https://codeload.github.com/ImangazalievM/Scripto/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252931274,"owners_count":21827102,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","java","java-interface","javascript","js-interface","scripto"],"created_at":"2024-11-13T20:23:10.595Z","updated_at":"2026-04-05T17:35:30.500Z","avatar_url":"https://github.com/ImangazalievM.png","language":"Java","readme":"![Scripto: Elegant Java-Javascript bridge](art/Scripto.png)\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://bintray.com/imangazaliev/maven/scripto/_latestVersion\"\u003e\u003cimg alt=\"Download\" src=\"https://api.bintray.com/packages/imangazaliev/maven/scripto/images/download.svg\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://android-arsenal.com/details/1/3983\"\u003e\u003cimg alt=\"Android Arsenal\" src=\"https://img.shields.io/badge/Android%20Arsenal-Scripto-brightgreen.svg?style=flat\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nAndroid-библиотека для отправки сообщений между Java и JavaScript в WebView.\n\n# Подключение библиотеки\n\n```gradle\ncompile 'com.github.imangazalievm:scripto:2.1.1'\n```\n\n# Использование библиотеки\n\nВ первую очередь мы должны скопировать файл ```scripto.js``` из тестового проекта в папку assets вашего проекта и инициализировать библиотеку:\n\n```java\nWebView webView = ...;\nScripto scripto = new Scripto.Builder(webView).build();\nscripto.addJsFileFromAssets(\"scripto.js\");\n```\n\n### Вызов JS-функций из Java\n\nНапример, у нас есть файл ```login.js``` с некоторыми функциями:\n\n```javascript\nfunction setLogin(login) {\n    document.getElementById('login_field').value = login;\n}\n\nfunction getLogin() {\n    return document.getElementById('login_field').value;\n}\n```\n\nДля вызова функций нам нужно создать Java-интерфейс с описанием JS-функций:\n\n```java\npublic interface LoginScript {\n\n    JavaScriptFunctionCall\u003cVoid\u003e setLogin(String login);\n\n    JavaScriptFunctionCall\u003cString\u003e getLogin();\n\n}\n```\n\nМетоды обязательно должны возвращать JavaScriptFunctionCall. В параметрах JavaScriptFunctionCall мы указываем тип, возвращаемый JS-функцией. В нашем случае первая функция ничего не возвращает (Void), а вторая возвращает строку (String).\n\nДалее нам нужно связать Java-интерфейс и JS-файл:\n\n```java\nscripto.addJsFileFromAssets(\"login.js\");\nLoginScript loginScript = scripto.create(LoginScript.class);\n```\n\nСкрипты обязательно должны быть связаны с интерфейсами до загрузки страницы.\n\nМы не можем сразу использовать наши скрипт, т. к. нам нужно дождаться полной загрузки страницы. Для этого нужно установить слушатель:\n\n```java\nscripto.onPrepared(new ScriptoPrepareListener() {\n    @Override\n    public void onScriptoPrepared() {\n         loginScript.setLogin(\"MySuperLogin\").call();\n    }\n});\n```\n\nДля получения данных из функции используйте следующий синтаксис:\n\n```java\nloginScript.getLogin()\n    .onResponse(login -\u003e Toast.makeText(MainActivity.this, login, Toast.LENGTH_LONG).show())\n    .call();\n```\n\nТакже мы можем обрабатывать ошибки, произошедшие в JS-коде:\n\n```java\n.onError(error -\u003e Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show())\n```\n\nДля конвертации пользовательских типов данных из JSON используется библиотека GSON.\n\nЕсли вы хотите получить \"голый\" JSON, то обязательно используйте класс RawReponse:\n\n```java\nJavaScriptFunctionCall\u003cRawResponse\u003e getJson();\n```\n\nПолучаем JSON:\n\n```java\nloginScript.getJson()\n    .onResponse(response -\u003e Toast.makeText(MainActivity.this, response.getResponse(), Toast.LENGTH_LONG).show())\n    .call();\n```\n\nТакже мы можем вызывать у функции у объектов, добавив над интерфейсом, описывающем JS-функцию аннотацию JsVariableName:\n\n```\npublic interface LoginScript {\n\n@JsVariableName(\"myVar\")\npublic interface LoginScript {\n\n    JavaScriptFunctionCall\u003cVoid\u003e setLogin(String login);\n\n    JavaScriptFunctionCall\u003cString\u003e getLogin();\n\n}\n```\n\nАннотацию JsVariableName можно применять к отдельному методу:\n\n```\n@JsVariableName(\"myVar\")\nJavaScriptFunctionCall\u003cString\u003e getLogin();\n```\n\nЕсли названия метода и вызываемой функции должны быть разными, воспользуйтесь аннотацией @JsFunctionName:\n\n```\n@JsFunctionName(\"myFuncName\")\nJavaScriptFunctionCall\u003cString\u003e getLogin();\n```\n\n### Вызов Java-методов из JavaScript\n\nВызов Java-методов из JavaScript очень сильно похож, на вызов с помощью JavaScriptInterface. Создайте Java-класс, который будет выступать в качестве JS-интерфейса:\n\n```java\npublic class AndroidInterface {\n\n    private Context context;\n\n    public AndroidInterface(Context context) {\n        this.context = context;\n    }\n\n    public void showToastMessage(String text) {\n        Toast.makeText(context, text, Toast.LENGTH_SHORT).show();\n    }\n}\n```\nОбязательным условием корректной работы интерфейса является, то чтобы в нем не было методов с одинаковыми именами. В ином случае библиотека выдаст сообщение об ошибке. Также нам не нужно ставить над методами аннотацию ```@JavaScriptInterface```.\n\nДобавляем интерфейс:\n\n```java\nscripto.addInterface(\"Android\", new AndroidInterface(context));\n```\n\nДля вызова метода ```showToastMessage``` нам нужно создать одноименную JS-функцию:\n\n```javascript\nfunction showToastMessage(text) {\n  Scripto.call('Android', arguments);\n};\n```\n\nВ ней мы вызываем специальную функцию из нашей библиотеки и передаем ей название JS-интерфейса и аргументы функции.\n\nВызываем метод из JavaScript:\n\n```javascript\nshowToastMessage(\"My super message\");\n```\n\nТочно также, как и в Java мы можем использовать коллбеки:\n```java\npublic String showToastMessage(String text) {\n        Toast.makeText(context, text, Toast.LENGTH_SHORT).show();\n        return \"My super response\";\n}\n```\n\nВызываем метод из JavaScript:\n\n```javascript\nshowToastMessage(\"My super message\", function(responseString) {\n        console.log(responseString);\n});\n```\n\nЕсли вам нужно передать из JavaScript пользовательский тип данных, сконвертируйте его в JSON при помощи ```JSON.stringify(object)```.\n\nЕсли вы хотите защитить методы от несанкционированного вызова, то вы можете использовать защиту при помощи аннотации ```@JavaScriptSecure```:\n\n```java\nScriptoInterfaceConfig config = new ScriptoInterfaceConfig().enableAnnotationProtection(true);\nscripto.addInterface(\"Android\", new AndroidInterface(this), config);\n```\n\nНе забудьте установить аннотацию над методом:\n\n```java\n@JavaScriptSecure\npublic void showToastMessage(String text) {\n    Toast.makeText(context, text, Toast.LENGTH_SHORT).show();\n}\n```\n\n## Лицензия\n\n```\nThe MIT License\n\nCopyright (c) 2016 Mahach Imangazaliev \n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n```","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimangazalievm%2Fscripto","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fimangazalievm%2Fscripto","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimangazalievm%2Fscripto/lists"}