So I'll admit this is the most hands on I've attempted to be with android yet, but I was wondering if anyone could either a) tell me how to toggle bluetooth on/off programmaticaly or point me to where I can find the source code for the Power Control widget and I'll just sort it out from there.
I know this is probably terribly simple I'm just finding it a bit overwhelming to get my bearings in the source code. heh.
alcaron said:
So I'll admit this is the most hands on I've attempted to be with android yet, but I was wondering if anyone could either a) tell me how to toggle bluetooth on/off programmaticaly or point me to where I can find the source code for the Power Control widget and I'll just sort it out from there.
I know this is probably terribly simple I'm just finding it a bit overwhelming to get my bearings in the source code. heh.
Click to expand...
Click to collapse
I would just use SwitchPro
SwitchPro Video Demo
Wow that is really cool! Although it doesn't help my situation.
I am actually more interested in extending the HTC default lockscreen to add a second slider (or possibly just a button) for enabling/disabling bluetooth.
Bluetooth is SUCH a power hog but I love handsfree in my car so short of finding some way to do a crazy RFID hack to enable it automatically when I get into my car (seriously, RFID is so great but aside from tagging merch nobody uses it for anything cool, if the evo had built in RFID capabilities, oh man, LOVE) I figure I'll just live with manually enabling it, however going through the unlock etc. is a bit cumbersome.
Failing all this I plan to just set it up to enable BT when plugged in/charging. So if what I want to do can't be done, I'll just set about making a useful/functional dock that doesn't require a bunch of jerking around (fiddling with a micro USB everytime I get in the car is for the birds).
alcaron said:
Wow that is really cool! Although it doesn't help my situation.
I am actually more interested in extending the HTC default lockscreen to add a second slider (or possibly just a button) for enabling/disabling bluetooth.
Bluetooth is SUCH a power hog but I love handsfree in my car so short of finding some way to do a crazy RFID hack to enable it automatically when I get into my car (seriously, RFID is so great but aside from tagging merch nobody uses it for anything cool, if the evo had built in RFID capabilities, oh man, LOVE) I figure I'll just live with manually enabling it, however going through the unlock etc. is a bit cumbersome.
Click to expand...
Click to collapse
Ohhhhhhh I see what you're wanting Have you tried flashing CyanogenMod 6? I get INSANE battery life(like 4x what I get on a stock ROM) so having BT on all the time wouldnt really be a problem.
There are already programs for car docks in the market place that enable Bluetooth when power is connected and turns it off when disconnected.
I'm hoping to avoid needing to dock it as I currently just leave my phone in my pocket when I get in the car. So having the ability to hit power and touch/slide to enable BT would be great. I just need to figure out how to activate it programattically.
If I go the route of docking it yeah I'll probably just use Locale or something.
djR3Z said:
Ohhhhhhh I see what you're wanting Have you tried flashing CyanogenMod 6? I get INSANE battery life(like 4x what I get on a stock ROM) so having BT on all the time wouldnt really be a problem.
Click to expand...
Click to collapse
off topic:
how do you get that much battery life??!?!?! mine seems to drain pretty quickly
on topic:
i'm pretty sure you can program bluetooth to toggle on and off automatically with the app juice defender. i'm not sure though.
alcaron said:
So I'll admit this is the most hands on I've attempted to be with android yet, but I was wondering if anyone could either a) tell me how to toggle bluetooth on/off programmaticaly or point me to where I can find the source code for the Power Control widget and I'll just sort it out from there.
I know this is probably terribly simple I'm just finding it a bit overwhelming to get my bearings in the source code. heh.
Click to expand...
Click to collapse
Eclair - Release (2.1 update 1) Power Control widget source code.
http://android.git.kernel.org/?p=pl...0733fc357c35e316383ad3c11f0;hb=eclair-release
Toggling programatically :
Code:
import com.android.settings.bluetooth.LocalBluetoothManager;
private static LocalBluetoothManager mLocalBluetoothManager = null;
private static final int STATE_DISABLED = 0;
private static final int STATE_ENABLED = 1;
private static final int STATE_INTERMEDIATE = 2;
private static int getBluetoothState(Context context) {
if (mLocalBluetoothManager == null) {
mLocalBluetoothManager = LocalBluetoothManager.getInstance(context);
if (mLocalBluetoothManager == null) {
return STATE_INTERMEDIATE;
}
}
int state = mLocalBluetoothManager.getBluetoothState();
if (state == BluetoothAdapter.STATE_OFF) {
return STATE_DISABLED;
} else if (state == BluetoothAdapter.STATE_ON) {
return STATE_ENABLED;
} else {
return STATE_INTERMEDIATE;
}
}
private void toggleBluetooth(Context context) {
int state = getBluetoothState(context);
if (state == STATE_ENABLED) {
mLocalBluetoothManager.setBluetoothEnabled(false);
} else if (state == STATE_DISABLED) {
mLocalBluetoothManager.setBluetoothEnabled(true);
}
Toast.makeText(context, R.string.gadget_toggle_bluetooth, Toast.LENGTH_SHORT).show();
}
Good luck, have fun.
Related
Guys, I wrote a multi-threaded app that is just a simple counter. When it reaches 30,000 the job is done. The counting thread which doesn't have to deal with the form, continues counting if I go back to start menu with the windows button. The app is surely there in the background cause I can see it in the task manager. There seem to be some complications though. Sometimes it's completely shut down after a while; this may be a problem with the emulator and of course I don't have a device to try it on.
Sorry if something like this was said before
a video I uploaded: http://www.youtube.com/watch?v=glzBui95tiY
Do a pastebin of the source code, if you want any serious input on this. Because I doubt it's running in the background (as it's not possible)
It looks like you're using an old emulator build. They've changed things more recently. Apps will no longer keep running.
It's not running in the foreground for sure
they're just two simple threads:
Code:
ThreadPool.QueueUserWorkItem(o =>
{
counter = 0;
complete = false;
while (true)
{
Dispatcher.BeginInvoke(() =>
{
textBlock1.Text = counter.ToString();
if (complete)
{
textBlock2.Text = "Counting Completed!";
}
});
Thread.Sleep(0);
}
});
ThreadPool.QueueUserWorkItem(o =>
{
while (true)
{
Dispatcher.BeginInvoke(() =>
{
if(!complete) counter++;
if (counter == 30000)
complete = true;
});
Thread.Sleep(0);
}
});
RustyGrom said:
It looks like you're using an old emulator build. They've changed things more recently. Apps will no longer keep running.
Click to expand...
Click to collapse
yeah, I think it's the April version. So this doesn't work anymore?
edit: yep! tested on the newest version and it looks like they've now completely killed multitasking, lol
I think that technically internal thread pools should be allowed, but just be killed when the application is closed.
So interesting - how will I be able to make a screenshot of any app?
Like maps or whatever else?
I use this function very open.
Most likely with a button combination, no information about it yet.
The API supports it though WriteableBitmap, which is available in the current WP7 API. So it's definitively possible.
Windcape said:
Most likely with a button combination, no information about it yet.
The API supports it though WriteableBitmap, which is available in the current WP7 API. So it's definitively possible.
Click to expand...
Click to collapse
So it will be build into the system without any 3rd party app needed?
doministry said:
So it will be build into the system without any 3rd party app needed?
Click to expand...
Click to collapse
Who knows, really hard to tell. I'm don't think this week's build have a dedicated screenshots functionality.
But it's definitively possible. As opposed to other functionality.
I've been banging my head against this one all morning and now i have a head ache so i decided to stick it out to you lot.
I want to make all my user controls (labels, checkbox's etc) transparent - well the text at least. I found this thread on MSDN but i'll be honest and say i'm not entirely sure what i'm supposed to do with it.
Thanks for your thoughts.
Works a treat. Lifted the code from the site and dropped it straight into the form class.
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.WindowsCE.Forms;
namespace TestDevApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
forum.xda-developers.com/search.php?searchid=90851847
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
DrawLabel(label1,e.Graphics);
DrawLabel(label2, e.Graphics);
DrawLabel(label3, e.Graphics);
DrawLabel(label4, e.Graphics);
}
private void DrawLabel(Label label, Graphics gfx)
{
if (label.TextAlign == ContentAlignment.TopLeft)
{
gfx.DrawString(label.Text, label.Font, new SolidBrush(label.ForeColor), label.Bounds);
}
else if (label.TextAlign == ContentAlignment.TopCenter)
{
SizeF size = gfx.MeasureString(label.Text, label.Font);
float left = ((float)this.Width + label.Left) / 2 - size.Width / 2;
RectangleF rect = new RectangleF(left, (float)label.Top, size.Width, label.Height);
gfx.DrawString(label.Text, label.Font, new SolidBrush(label.ForeColor), rect);
}
else //is aligned at TopRight
{
SizeF size = gfx.MeasureString(label.Text, label.Font);
float left = (float)label.Width - size.Width + label.Left;
RectangleF rect = new RectangleF(left, (float)label.Top, size.Width, label.Height);
gfx.DrawString(label.Text, label.Font, new SolidBrush(label.ForeColor), rect);
}
}
}
}
Devtrans is the view in VS
Transparent is the actual running code.
Cool thanks.
I did try using DrawString but the drawn text doesn't scroll with the form when you... well.... scroll the form.
I'm gonna have the afternoon off but i will check it out properly later. Would this also work for check boxes? If so what are the changes that would need to be made?
Checkboxes might be a different matter. The above method does not work, it only deals with the text caption. There is is an article on The Code Project at
http://www.codeproject.com/KB/dotnet/TransparentControl.aspx
It appears like they have almost created a control from scratch. You may have to take control/override that much of the object, to get it to work, that you have almost created a new control.
stephj said:
Checkboxes might be a different matter. The above method does not work, it only deals with the text caption. There is is an article on The Code Project at
http://www.codeproject.com/KB/dotnet/TransparentControl.aspx
It appears like they have almost created a control from scratch. You may have to take control/override that much of the object, to get it to work, that you have almost created a new control.
Click to expand...
Click to collapse
I did see that page but i couldn't figure out how the hell to use it
Ok, so now you have found one of the BIGGEST challenges to WM development.
I spent 4+ months trying to get the same thing you are looking for (well, what I assume you are looking for), that is: A transparent label that you can use your finger to scroll.
If that is what you are looking for, I can tell you right now that you need to either look into custom controls that already do this or decide how much time you are willing to invest into something as simple as that.
Here is the basic components that you will need to code to get DrawString to properly scroll with your finger:
You will need to code up some kind of container or panel that holds the current virtual x,y coordinates.
You will need to code up some kind of custom control that can be added to the previously made container
Create logic in the container to take the current virtual x,y coords and determine which custom controls are visible and should be drawn on the screen, pass them their offset coords, and draw the control
Override the OnMouse*ACTION* events on the container to manipulate the virtual x,y coords and then refresh the screen
You also will need to know about double buffering so you don't get any flickering.
It's a very very hard thing to do on WinMo, something that other platforms take for granted. This is one of the reasons that some custom WinMo programs have UIs that are either really terrible, or take tons of resources.
If you want to give it a go (and I would highly recommend doing it, I can't tell you how much I learned about software development by creating my own custom controls) I can help point you in the right directions. Feel free to take a look at the code I've written for my Facebook app (specifically the XFControls and SenseUI projects). I'm not on XDA as often as I'd like, but send me a PM with your questions and I'll respond when I log in.
Good Luck!
Preface
Like some other devs around here, I was wondering if there's a good way of forcing my phone into the Car Dock mode, which not only auto-launches Car Home application, but also turns on loudspeaker, and also allows TouchWiz to operate in landscape mode (which is kinda useful in dock).
Research (skip this section if you are not interested):
The right way to do this is via a hardware JIG (like here). I had a thing like this once, it came from a dissected Galaxy S dock, and worked fine (or at least funny).
Later on, I had to give the dock away, and got myself a Universal Samsung dock (like this one). It's fine to hold my phone and charge it, but I have already tasted the complete dock experience, so that's what I wanted to achieve...
First, I've installed an NFC tag on this dock.
Second, I used some Car Mode app from Google Play, which turned out useless: it used a UiModeManager API, which only launches Car Home, but doesn't do the auto-loudspeaker and other things.
There is a known, proper solution of achieving that functionality, which is running this command:
Code:
su -c /system/bin/am broadcast -a android.intent.action.DOCK_EVENT --ei android.intent.extra.DOCK_STATE 2
(under root, of course). The problem was, I wanted my app to send a "sticky" broadcast message (like a real dock does), so that a
Code:
registerReceiver(null, new IntentFilter(Intent.ACTION_DOCK_EVENT)).getIntExtra(Intent.EXTRA_DOCK_STATE, -1);
call would return me a correct dock state (as written in Android SDK docs). My search on how to do this got no result though.
An API call for that would be something like
Code:
sendStickyBroadcast((new Intent(Intent.ACTION_DOCK_EVENT)).putExtra(Intent.EXTRA_DOCK_STATE, Intent.EXTRA_DOCK_STATE_CAR));
but it is only possible to send this message from within a firmware... Bummer.
But hey, we can go deeper, and look at the firmware itself!
So, the Android source code shows us a file named DockObserver.java, which contains the code that sends the message I need (right now it uses sendStickyBroadcastAsUser from API Level 17, which is still "not available to applications that are not pre-installed on the system image"). Looking closer, there's an UEvent handler that actually sends it. So, basically, if we send that UEvent, it will not only imitate an effect, it will imitate the cause, and everything will work even better than I wanted it to (e.g. it can play a docking sound)! That's what my first NDK utility did:
Code:
char event[] = "ACTION=change\0DEVPATH=/devices/virtual/switch/dock\0SUBSYSTEM=switch\0SWITCH_NAME=state\0SWITCH_STATE=2";
int sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
if (sock != -1) {
struct sockaddr_nl snl;
struct iovec iov = { event, sizeof(event) };
struct msghdr msg = { &snl, sizeof(snl), &iov, 1, NULL, 0, 0 };
memset(&snl, 0, sizeof(struct sockaddr_nl));
snl.nl_family = AF_NETLINK;
snl.nl_pid = getpid();
snl.nl_groups = -1;
sendmsg(sock, &msg, 0);
close(sock);
}
The rest was simple: bundle this utility with a simple java application, which reads current dock state (as described above) and switches it via "su -c <utility> <mode>" call.
Conclusion:
So, the app itself is available in Google Play (or you can download the attached file).
Run it once, you're in a Car Dock mode. Run again, you're back to normal.
Assign its launch to an NFC sticker, and you'll get a fully-featured virtual car dock.
As a bonus, you may find the source code on GitHub.
Isn't this supposed to be in theme and application section?
Sent from my GT-I9300 using xda premium
Having tw going landscape alone would have been enough for me, thank you for all your work. I've seen several people trying to achieve this by software alone and apparently was rather tough.
Keep the good work
Sent from my GT-I9300 using xda premium
I just stumbled upon this and it looks like you solve the exact same problem I was facing. Thank you!!!
However, I do have an issue when using this app together with NFC Task Launcher. Whenever I launch the app manually, the toggle works great. However, whenever I have NFC Task Launcher either launch the application or launch the apps main activity, I receive an "Already in normal mode" message. If the device is already in car mode, I get "Already in Car Mode" instead of having it toggle back to Normal mode.
Are there any ways around this? What program do you use for NFC tags?
EDIT:
I took a look at your source and it looks like NFC Task launcher is using a different action other than "android.intent.action.MAIN" or "com.ginkage.carmodetoggle.ENABLE" when calling your app. This appears to be the problem. Other similar apps like Zandra or NFC ReTag are calling it properly. For now, I'll just use NFC ReTag to get around it.
Very handy app but when i open it it actualy open s voice first
Sent from my GT-I9300 using xda premium
Can anyone help me with some advice. I want to create an App that is loaded and then left running while other apps are loaded. I then want it to monitor what is output to the smartphone screen and when it recognises a particular pattern or logo being displayed to do something?
Is this possible?
Anyone know how to do - hopefully with javascript?
Phil
Is it a keylogger. Of course you can record monitor all the time, but it's usually needn't. You can regularly check an app that you want to monitor wherether it's running or not, by using this code, as long as you know class name or service name.
public static boolean isMyServiceRunning(Class<?> serviceClass,Context ctx) {
ActivityManager manager = (ActivityManager)ctx.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
Correct me if I'm wrong, but this sounds like a Keylogger + Screenlogger. What exactly are you trying to monitor? Your app of anything that is happening on the screen? If its the latter then I very much hope that it is not possible, otherwise that would be a big security hole if any app can simple record the screen of any other app.
Use the Accessibility Service
It requires a special permission from users but it will let you read all the content on the screen, including what users click on etc. I'm working on an app called Sesame Lock Screen that uses the Accessibility Service to make shortcuts for users based on their behavior.
B/c it's a sensitive permission we don't send any of the data back to our servers. You should probably do the same.
Let me know if I can answer more questions about this.
Hi,
First, a disclaimer.
I am a Java and xposed noob. My background is in embedded C development so I can get by with some simple Java code and thanks to the great tutorials online I have been able to put together an xposed module but I'm struggling with a problem that is beyond my abilities now and am reaching out to the community for help.
Next, the background.
I have an Android head unit in my car. There is an app that provides me with CarPlay functionality but none of the controls on the steering wheel work with the app. When I analysed the code I found that they handle all of their button inputs using proprietary methods that do not inject an event into any input streams. I wrote an xposed module to hook the button press methods and then inject a proper input into one of the event streams.
Initially I tried to use the command line 'input' command to do this but since it is a Java app and takes about 1s to load it was too slow. My only other option was to create a virtual device on an input stream that I could then use to inject keypresses through the hooked method. To create a virtual device I needed to write C code that my xposed module would be able to access through the JNI. Long story short, after some pain I was able to get the native library integrated into the project and compiling using the NDK.
Finally, the problem.
When I was using the module without the native library it worked but just with a large delay because of the time it takes to load the 'input' java app. I was able to see logs from the module in the logcat as I hooked the method and as I went through the various actions within the hook.
As soon as I introduce the native library though the entire xposed module just stops running completely. I do not get any logs from the module even though I have installed, activated and rebooted. It shows up in the xposed installer but it just does nothing. The funny thing is that this happens even if I make no reference whatsoever to any native functions within the library. All I need to do to kill the module is to build it with the System.loadlibrary line in the Main.java uncommented. As soon as I comment that piece of code out the module starts to hook the function and output logs again. Below is the code from the Main.Java that I am referring to. I am happy to make any manifest, C and gradle files available too. Looking for any ideas as to why the module dies completely as soon as I include this...
Code:
package projects.labs.spike.zlink_xposed_swc;
import de.robv.android.xposed.XposedBridge;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.IXposedHookZygoteInit;
import de.robv.android.xposed.XSharedPreferences;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import de.robv.android.xposed.XposedHelpers;
import android.app.AndroidAppHelper;
import android.content.Intent;
import android.os.Bundle;
import android.content.Context;
/* shellExec and rootExec methods */
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ByteArrayOutputStream;
import android.view.KeyEvent;
import android.media.AudioManager;
public class Main implements IXposedHookLoadPackage {
public static final String TAG = "ZLINK_XPOSED ";
public static void log(String message) {
XposedBridge.log("[" + TAG + "] " + message);
}
//public native int CreateVirtualDevice();
//public native int SendPrev();
@Override
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
log("handleLoadPackage: Loaded app: " + lpparam.packageName);
if (lpparam.packageName.equals("com.syu.ms")) {
findAndHookMethod("module.main.HandlerMain", lpparam.classLoader, "mcuKeyRollLeft", new XC_MethodHook() {
@Override
protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
// previous
log("PREVKEYHIT");
//rootExec("input keyevent 88");
log("EVENTSENT");
//Below was trying to use media keys which zlink never responded to...
/* Context context = (Context) AndroidAppHelper.currentApplication();
AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PREVIOUS);
mAudioManager.dispatchMediaKeyEvent(event);
KeyEvent event2 = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PREVIOUS);
mAudioManager.dispatchMediaKeyEvent(event2);*/
//Below is the failed broadcast intent method...
/*Context mcontext = (Context) AndroidAppHelper.currentApplication();
Intent i = new Intent("com.android.music.musicservicecommand");
i.putExtra("command", "pause");
mcontext.sendBroadcast(i);*/
}
});
}
}
public static String rootExec(String... strings) {
String res = "";
DataOutputStream outputStream = null;
InputStream response = null;
try {
Process su = Runtime.getRuntime().exec("su");
outputStream = new DataOutputStream(su.getOutputStream());
response = su.getInputStream();
for (String s : strings) {
s = s.trim();
outputStream.writeBytes(s + "\n");
outputStream.flush();
}
outputStream.writeBytes("exit\n");
outputStream.flush();
try {
su.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
res = readFully(response);
} catch (IOException e) {
e.printStackTrace();
} finally {
Closer.closeSilently(outputStream, response);
}
return res;
}
public static String readFully(InputStream is) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length = 0;
while ((length = is.read(buffer)) != -1) {
baos.write(buffer, 0, length);
}
return baos.toString("UTF-8");
}
static {
System.loadLibrary("native-lib");
}
}
Have you tried capturing an ADB log _during the bootup_?
Xposed bugs in general are unfortunaley hard to identify and harder to fix, since the underlying code isn't well understood and/or maintained by many people.
Namnodorel said:
Have you tried capturing an ADB log _during the bootup_?
Xposed bugs in general are unfortunaley hard to identify and harder to fix, since the underlying code isn't well understood and/or maintained by many people.
Click to expand...
Click to collapse
Thanks for the response. I think that I have it figured out. The System.loadlibrary method looks for the native library within a path relative to the process that it is running within. The code within the apk ultimately does not run within that apk process, it runs within the xposed process. You therefore need to give xposed an absolute path to the library using the system.load method instead. Going to do some fiddling tonight and see if it works.
looxonline said:
Thanks for the response. I think that I have it figured out. The System.loadlibrary method looks for the native library within a path relative to the process that it is running within. The code within the apk ultimately does not run within that apk process, it runs within the xposed process. You therefore need to give xposed an absolute path to the library using the system.load method instead. Going to do some fiddling tonight and see if it works.
Click to expand...
Click to collapse
What about an alternative without using library we discussed earlier? Are you planning to test this as well?
If so, please let me know how it went.
C3C076 said:
What about an alternative without using library we discussed earlier? Are you planning to test this as well?
If so, please let me know how it went.
Click to expand...
Click to collapse
I didn't try it yet for two reasons.
1.) From the research I have done it seems as if my app would need the system INJECT_EVENTS permission in order to send keypress events outside of its own process. I cannot get this permission unless I sign my apk with the system cert that the ROM is compiled with. Maybe the method that you are using in the suggestion does not need this cert? Have you personally used this to inject key events across processes? I did see that you are getting the context of the system input service so maybe that solves this issue if the request appears to come from that PID...???
2.) The unit that I am working with has only two input devices and none of them have the keycodes I require. Does your method use a completely virtual device that is created on the fly? If so then it could work well without the need for me to create an HID input device.
I mostly was just on a role with the method that I was trying and I didn't want to turn back since I was so far down the road. I'm sure you understand how addictive certain challenges become and its quite fun to try to get them working even if they may not be the most optimal way.
In any case I managed to get the native library working last night and can successfully convince Android that I have a real HID keyboard plugged in and then send key events through that keyboard. Still not done though as there are a few hiccups that need solving. May still try your original suggestion. Thanks
looxonline said:
I didn't try it yet for two reasons.
1.) From the research I have done it seems as if my app would need the system INJECT_EVENTS permission in order to send keypress events outside of its own process. I cannot get this permission unless I sign my apk with the system cert that the ROM is compiled with. Maybe the method that you are using in the suggestion does not need this cert? Have you personally used this to inject key events across processes? I did see that you are getting the context of the system input service so maybe that solves this issue if the request appears to come from that PID...???
2.) The unit that I am working with has only two input devices and none of them have the keycodes I require. Does your method use a completely virtual device that is created on the fly? If so then it could work well without the need for me to create an HID input device.
I mostly was just on a role with the method that I was trying and I didn't want to turn back since I was so far down the road. I'm sure you understand how addictive certain challenges become and its quite fun to try to get them working even if they may not be the most optimal way.
In any case I managed to get the native library working last night and can successfully convince Android that I have a real HID keyboard plugged in and then send key events through that keyboard. Still not done though as there are a few hiccups that need solving. May still try your original suggestion. Thanks
Click to expand...
Click to collapse
I see.
1) Depends on in what process (package) your hooks are running within because permissions of this process apply of course, not the permissions you define in your module's manifest.
I am using key injecting method within "android" process (package) which means it works without me needing to worry about INJECT_EVENTS permission as "android" process already has it.
By the way, missing permissions are not of a big issue when developing with xposed as you can really do some magic with it.
E.g. I was adding some functionality to SystemUI that required some additional permissions that SystemUI typically lacks. So my module takes care of it.
https://github.com/GravityBox/Gravi...eco/pie/gravitybox/PermissionGranter.java#L75
C3C076 said:
I see.
1) Depends on in what process (package) your hooks are running within because permissions of this process apply of course, not the permissions you define in your module's manifest.
I am using key injecting method within "android" process (package) which means it works without me needing to worry about INJECT_EVENTS permission as "android" process already has it.
By the way, missing permissions are not of a big issue when developing with xposed as you can really do some magic with it.
E.g. I was adding some functionality to SystemUI that required some additional permissions that SystemUI typically lacks. So my module takes care of it.
https://github.com/GravityBox/Gravi...eco/pie/gravitybox/PermissionGranter.java#L75
Click to expand...
Click to collapse
Wow! I had no idea that you can use an xposed helper function to grant permissions to whatever process you are hooked within like that. That is VERY cool. Thanks so much for sharing