Я создал службу для замены клавиатуры по умолчанию на мою настраиваемую клавиатуру ... код для моей настраиваемой клавиатуры работает (я тестировал в приложении). Я завернул код в сервис и развернул его на устройстве Android. Когда я пытаюсь включить настраиваемую клавиатуру с устройства, она просто дает сбой ... Я использовал log cat, чтобы захватить исключение. вот исключение:
Time Device Name Type PID Tag Message 06-03 00:03:38.287 Samsung SM-J327P Error 3044 AndroidRuntime java.lang.RuntimeException: Unable to instantiate service SimpleKeyboard.SimpleKeyboard.Activity1: java.lang.ClassNotFoundException: Didn't find class "SimpleKeyboard.SimpleKeyboard.Activity1" on path: DexPathList[[zip file "/data/app/SimpleKeyboard.SimpleKeyboard-1/base.apk"],nativeLibraryDirectories=[/data/app/SimpleKeyboard.SimpleKeyboard-1/lib/arm, /data/app/SimpleKeyboard.SimpleKeyboard-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]] at android.app.ActivityThread.handleCreateService(ActivityThread.java:3844) at android.app.ActivityThread.access$2100(ActivityThread.java:231) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1911) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:7422) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
ниже размещен мой манифест:
<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android" package = "SimpleKeyboard.SimpleKeyboard" android:versionCode = "1" android:versionName = "1.0" android:installLocation = "auto">
<uses-sdk android:minSdkVersion = "16" android:targetSdkVersion = "23" />
<uses-permission android:name = "android.permission.READ_LOGS" />
<uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />
<application>
<service android:name = ".Activity1" android:label = "@string/app_name" android:permission = "android.permission.BIND_INPUT_METHOD" android:exported = "true">
<intent-filter>
<action android:name = "android.view.InputMethod" />
</intent-filter>
<meta-data android:name = "android.view.im" android:resource = "@xml/method" />
</service>
</application>
</manifest>
вот услуга:
public class Activity1 : InputMethodService
{
private KeyboardView kv;
private Keyboard keyboard;
private bool isCaps = false;
public Activity1()
{
}
public override void OnInitializeInterface()
{
if (IsExternalStorageWritable())
{
File appDirectory = new File(Android.OS.Environment.DirectoryDownloads + "/MyPersonalAppFolder");
File logDirectory = new File(appDirectory + "/log");
File logFile = new File(logDirectory, "logcat" + Guid.NewGuid() + ".txt");
// create app folder
if (!appDirectory.Exists())
{
appDirectory.Mkdirs();
}
// create log folder
if (!logDirectory.Exists())
{
logDirectory.Mkdirs();
}
// clear the previous logcat and then write the new one to the file
try
{
Java.Lang.Process process = Runtime.GetRuntime().Exec("logcat -c");
process = Runtime.GetRuntime().Exec("logcat -f " + logFile);
}
catch (IOException e)
{
e.PrintStackTrace();
}
}
else if (isExternalStorageReadable())
{
// only readable
}
else
{
// not accessible
}
base.OnInitializeInterface();
}
public override void OnCreate()
{
if (IsExternalStorageWritable())
{
File appDirectory = new File(Android.OS.Environment.DirectoryDownloads + "/MyPersonalAppFolder");
File logDirectory = new File(appDirectory + "/log");
File logFile = new File(logDirectory, "logcat" + Guid.NewGuid() + ".txt");
// create app folder
if (!appDirectory.Exists())
{
appDirectory.Mkdirs();
}
// create log folder
if (!logDirectory.Exists())
{
logDirectory.Mkdirs();
}
// clear the previous logcat and then write the new one to the file
try
{
Java.Lang.Process process = Runtime.GetRuntime().Exec("logcat -c");
process = Runtime.GetRuntime().Exec("logcat -f " + logFile);
}
catch (IOException e)
{
e.PrintStackTrace();
}
}
else if (isExternalStorageReadable())
{
// only readable
}
else
{
// not accessible
}
base.OnCreate();
}
public override View OnCreateInputView()
{
keyboard = new Keyboard(this, Resource.Xml.Qwerty);
View kvl = (View)LayoutInflater.Inflate(Resource.Layout.Keyboard, null);
kv = kvl.FindViewById<KeyboardView>(Resource.Id.keyboard);
kv.Keyboard = keyboard;
kv.OnKeyboardActionListener = new MyKeyboardListener(this);
return kv;
// return null;
}
/* Checks if external storage is available for read and write */
public bool IsExternalStorageWritable()
{
string state = Android.OS.Environment.ExternalStorageState;
if (Android.OS.Environment.MediaMounted.Equals(state))
{
return true;
}
return false;
}
/* Checks if external storage is available to at least read */
public bool isExternalStorageReadable()
{
string state = Android.OS.Environment.ExternalStorageState;
if (Android.OS.Environment.MediaMounted.Equals(state) ||
Android.OS.Environment.MediaMountedReadOnly.Equals(state))
{
return true;
}
return false;
}
}
Что я делаю не так?
Нет, я не решил свою проблему ... Я пробовал то, что вы предложили ... У меня все еще та же проблема.
java.lang.ClassNotFoundException: Didn't find class
Обратитесь к @SushiHangover's отвечать:
Это известная проблема в Xamarin.Android: xamarin.android_8.1 / # Known_Issues
Исправление GitHub PR: https://github.com/xamarin/xamarin-android/pull/1142
Вы можете использовать очистить / восстановить в качестве обходного пути в Windows.
Я пробовал очистить / перестроить несколько раз ... все еще получаю ту же ошибку ... если это проблема в 8.1, поможет ли понижение версии проекта? Кроме того, вы сказали, что это проблема с Windows ... теоретически это должно работать на Mac?
@ Дарон, это странно, это должно работать. Если возможно, не могли бы вы поделиться базовой демонстрацией, которая может воспроизвести проблему через онлайн-репо? Просто чтобы убедиться, что мы проверяем то же самое, что и вы.
вот ссылка на мой дропдокс, там проект заархивирован .. dropbox.com/s/x32wqikzkiftg4n/SimpleKeyboard.rar?dl=0
Только что понял, что у меня 15.2 ... Я собираюсь установить 15.7.3 и посмотреть, осталась ли у меня эта проблема
@Daron, когда вы устанавливаете VS 15.7.3, у вас будет проблема с AXML-дизайнер, но не беспокойтесь об этом, вы можете найти там обходной путь. И этот вопрос должен быть решен в VS 15.7.4.
Мне действительно показалась интересной эта строка: «/data/app/SimpleKeyboard.SimpleKeyboard-1/base.apk"] ... класс называется SimpleKeyboard.SimpleKeyboard ... откуда взялось" -1 "... (Я получил это из журналов, опубликованных выше) ... я даже не могу добавить тире 1, потому что тире являются специальными символами ... возможно, это как-то связано с тем, почему он не может найти имя службы.
Все еще не на 100%, в чем была проблема, но я загружаю образец проекта из Xamarin и вижу несколько ключевых отличий ... добавлен и добавлен файл и две строки в этом манифесте, которые отсутствовали ... теперь он работает ... для всех эту проблему, ознакомьтесь с примером проектов службы xamarin, и вы также сможете исправить свою проблему.
Вы решили свою проблему?