我目前正在开发一款应用程序,可在驾驶时读取短信/电子邮件.许多用户都希望得到WhatsApp/KakaoTalk的支持.
但是,由于没有"官方"方式来接收他们的消息,因此只有三个选项,都需要root:
在给定的intervall中扫描数据库的更简单方法.
另一种方法是运行具有root权限的服务并注册侦听其推送通知的接收器.这必须使用root来完成,因为两个软件包都需要基于签名的权限才能接收其推送通知.
还有另一件事我想到:安装后是否可以手动添加APK权限?在这种情况下,我可以将c2dm权限添加到我的包中.
问题是,我究竟如何运行具有root权限的服务(实际上是否可能)?我知道如何使用root运行shell命令或二进制文件,但我不知道如何以root身份启动APK的一部分.
是否可以将BroadcastReceiver集成到二进制文件中?我实际上没有使用C/C++的经验,尤其是在Android环境中.
你能帮帮我吗?谢谢.
编辑:就像我在评论中说的那样,我不想使用AccesibilityService,因为它不符合我的需要(例如,如果有多个未读消息,它会给我"2条未读消息",也不包括完整消息身体).
edit2:只是澄清事情:我知道如何用root运行命令.我需要知道的是如何注册接收特定广播"普通"接收器的广播接收器,因为广播本身需要我没有的基于签名的许可.
我已将服务编写为应用程序的一部分.我尝试使用以下代码从第二个应用程序调用此服务:
Intent intent = new Intent () ;
intent.setClassName("com.test" ,"com.test.DownloadService") ;
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(handler);
intent.putExtra("MESSENGER", messenger);
intent.setData(Uri.parse("http://www.vogella.com/index.html"));
intent.putExtra("urlpath", "http://www.vogella.com/index.html");
this.startService(intent);
Run Code Online (Sandbox Code Playgroud)
它给出了以下例外
07-10 09:27:28.819: ERROR/AndroidRuntime(4226): FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.inject/com.inject.MyActivity}: java.lang.SecurityException: Not allowed to start service Intent { dat=http://www.vogella.com/index.html cmp=com.test/.DownloadService (has extras) } without permission not exported from uid 10109
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1971)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1996)
at android.app.ActivityThread.access$700(ActivityThread.java:126)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1156)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4458)
at java.lang.reflect.Method.invokeNative(Native …Run Code Online (Sandbox Code Playgroud) 我是Android新手.我正在为Media Player创建服务,以便即使我关闭应用程序也可以继续播放歌曲.我已经为Media Player创建了活动,它具有播放,暂停,下一个,上一个,搜索栏等所有功能,还包括oncompletionlistener.一切都很棒.但现在我希望所有都应该由服务管理.
我创建了MyService类:
public class MyService extends Service {
public static MediaPlayer mp;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
mp = new MediaPlayer();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
Run Code Online (Sandbox Code Playgroud)
但是在我的播放器活动中,我为Songlist创建了ArrayList,我正在使用currentsongIndex并通过它我保持所有功能,如next,previous和all ..现在我在服务中如何获得歌曲列表,这也是我的活动所需要的? ?我应该在哪里创建MediaPlayer对象意味着在服务或活动?
对于MediaPlayer我已经参考了http://www.androidhive.info/2012/03/android-building-audio-player-tutorial/.对于我的媒体播放器代码,您可以参考此网站.谢谢.让我感到疑惑.我感到很困惑.很快回复我..
我有一个主要的活动和约束服务.绑定服务从网络接收命令,该命令触发将消息发送到主活动中的处理程序.通过传递Handler对服务的引用,我得到了一切.然后......我偶然发现了一个叫做Messenger的东西.
Messenger:引用Handler,其他人可以使用它向其发送消息.这允许跨进程实现基于消息的通信,方法是在一个进程中创建指向Handler的Messenger,并将该Messenger交给另一个进程.
这引发了一些问题:
我正在尝试获取位置更新信息.为此,我创建了一个服务,在服务类的onStartCommand中我正在创建GoogleApiClient,但我没有在服务中获得连接回调.请帮忙解决这个问题.
下面给出的是服务代码和活动我已经使用startService方法启动了服务:
startService(new Intent(this, LocationService.class));
Run Code Online (Sandbox Code Playgroud)
服务代码
public class LocationService extends Service implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener, LocationListener {
private GoogleApiClient mLocationClient;
private Location mCurrentLocation;
LocationRequest mLocationRequest;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO do something useful
Toast.makeText(this, "onStartCommand", Toast.LENGTH_SHORT).show();
mLocationClient = new GoogleApiClient.Builder(LocationService.this)
.addApi(LocationServices.API).addConnectionCallbacks(LocationService.this)
.addOnConnectionFailedListener(LocationService.this).build();
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(1000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setFastestInterval(1000);
return Service.START_NOT_STICKY;
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
mCurrentLocation = location;
Toast.makeText(this, mCurrentLocation.getLatitude() +", "+ mCurrentLocation.getLatitude(), Toast.LENGTH_SHORT).show();
}
@Override …Run Code Online (Sandbox Code Playgroud) 我遇到的问题是Activity + Service,我有以下数量的活动和服务.
LoginActivity => OrderListActivity => AddOrderActivity => ConfirmOrderActivity
在某个间隔的持续时间内,来自另一个单独服务的服务呼叫.
public class CheckAutoSyncReceivingOrder extends Service {
Timer timer;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
if(timer != null) {
timer.cancel();
Log.i(TAG, "RECEIVING OLD TIMER CANCELLED>>>");
}
timer = new …Run Code Online (Sandbox Code Playgroud) android android-service android-activity android-intentservice
在我的应用程序中,我在后台使用基于位置的服务.因此我需要在销毁时重新启动我的服务.
但是我在logcat中收到了这条消息
ProcessRecord的虚假死亡{320afaf6 20614:com.odoo.crm:my_odoo_gps_service/u0a391},curProc for 20614:null
我的服务 onTaskRemoved
@Override
public void onTaskRemoved(Intent rootIntent) {
System.out.println("onTaskRemoved called");
Intent restartServiceIntent = new Intent(App.getAppContext(), this.getClass());
restartServiceIntent.setPackage(getPackageName());
PendingIntent restartServicePendingIntent =
PendingIntent.getService(App.getAppContext(), 1, restartServiceIntent,
PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmService =
(AlarmManager) App.getAppContext().getSystemService(Context.ALARM_SERVICE);
alarmService.set(
AlarmManager.ELAPSED_REALTIME,
SystemClock.elapsedRealtime() + 1000,
restartServicePendingIntent);
}
Run Code Online (Sandbox Code Playgroud)
我的服务onDestroy
@Override
public void onDestroy() {
System.out.println("destroy service");
super.onDestroy();
wakeLock.release();
}
Run Code Online (Sandbox Code Playgroud)
我的服务onStartCommand
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return Service.START_STICKY;
}
Run Code Online (Sandbox Code Playgroud)
我不知道错误是什么.我在google和stackoverflow中都进行了搜索.所有这些都引用了Service.START_STICKY.但我已经用过了.
相同的服务重启在KitKat中有效,但有一些延迟(约5分钟).
任何帮助表示赞赏.
我有一个有两个服务的应用程序.
一个用于在其他应用程序上显示用于浮动(叠加)的UI WindowManager.另一种是使用位置跟踪GooglePlayAPI.我的应用总是运行这些服务.
我希望这些服务不被操作系统杀死.所以我打电话Service.startForeground().但是,通知抽屉中有两个通知.
有没有办法为这两种服务使用单一通知?
使用案例:将后台队列中的图像上传到服务器,图像可以是存储在手机内存中的网址或图像文件.
我想要的是将队列中的项目数量限制为3并将模糊图像显示为在活动中的回收站视图中上载的实际图像的占位符,每个占位符上都有一个进度条指示已上载了多少内容.在每个占位符的顶部有三个按钮,可以暂停,取消或恢复上传图像.
现状:现在,我是用Multipart在Retrofit 1.9.0上传图片和该服务呼叫在活动中完成的.
我无法弄清楚如何使用Retrofit或任何其他库来取消,暂停或恢复多部分POST请求以及如何将UI事件与api服务线程联系起来.我可以从服务更新UI,但是如何从UI中的事件(暂停/恢复/取消)更新服务中的某些内容?
我该如何处理这个用例?我需要使用服务吗?我可以根据服务中执行的请求在其他活动中显示进度指示器吗?这个过程的架构应该是什么?我不需要它的代码,但是如果有一些与此相关的有用的引用,我想阅读并测试它以最终得出我的方法.
我想知道是否可以使用Firebase jobdispatcher来安排网址命中并获取响应以更新数据库.我希望它每天晚上运行一次.有谁知道这是否可能?
我找不到这样做的好例子.我已经阅读了android文档和https://github.com/firebase/firebase-jobdispatcher-android#user-content-firebase-jobdispatcher-.
我需要使用Firebase jobdispatcher,因为我的目标是API 16.
提前致谢.
UPDATE
这就是我每天安排一次的工作.
final int periodicity = (int) TimeUnit.HOURS.toSeconds(24);
final int toleranceInterval = (int) TimeUnit.HOURS.toSeconds(1);
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
Job job = dispatcher.newJobBuilder()
.setService(UpdateTVJobService.class)
.setTag(JOB_TAG)
.setTrigger(Trigger.executionWindow(periodicity, periodicity + toleranceInterval))
.setLifetime(Lifetime.FOREVER)
.setRecurring(true)
.setReplaceCurrent(true)
.build();
int result = dispatcher.schedule(job);
if (result != FirebaseJobDispatcher.SCHEDULE_RESULT_SUCCESS) {
Log.d("JOB_TAG", "ERROR ON SCHEDULE");
}
Run Code Online (Sandbox Code Playgroud)