java - 服务中的 Android OnPrimaryClipChangedListener 在应用程序之外不起作用
问题描述
我尝试在java中开发一个应用程序,我尝试在应用程序内部或当应用程序关闭时(按下主页按钮)获取所有剪贴板语句我在互联网上搜索后尝试了很多东西,但除了这个我没有得到任何东西SDK >= 26 出现问题 ------------ 我做的步骤 ----------
- 创建服务
- 在清单文件中定义服务
- 创建通知渠道
- 通过(startForeground)启动服务
注意:如果我在应用程序内复制,这会非常有效
----------------------------------------- ClipboardMonitorService.java
package com.example.testclipboard;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Service;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
import androidx.core.app.NotificationCompat;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.Date;
/**
* Monitors the {@link ClipboardManager} for changes and logs the text to a file.
*/
public class ClipboardMonitorService extends Service {
private ExecutorService mThreadPool = Executors.newSingleThreadExecutor();
private ClipboardManager mClipboardManager;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onCreate() {
super.onCreate();
//startForeground();
// TODO: Show an ongoing notification when this service is running.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
startMyOwnForeground();
else
startForeground(1, new Notification());
//mHistoryFile = new File(Environment.getExternalStorageDirectory(), FILENAME);
mClipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
mClipboardManager.addPrimaryClipChangedListener(
mOnPrimaryClipChangedListener);
Log.i("Service Created ","Yes Created !");
}
@RequiresApi(api = Build.VERSION_CODES.O)
private void startMyOwnForeground(){
String NOTIFICATION_CHANNEL_ID = "com.example.testclipboard";
String channelName = "My Background Service";
NotificationChannel chan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName, NotificationManager.IMPORTANCE_NONE);
chan.setLightColor(Color.BLUE);
chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
assert manager != null;
manager.createNotificationChannel(chan);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
Notification notification = notificationBuilder.setOngoing(true)
//.setSmallIcon(R.drawable.icon_1)
.setContentTitle("App is running in background")
.setPriority(NotificationManager.IMPORTANCE_MIN)
.setCategory(Notification.CATEGORY_SERVICE)
.build();
startForeground(2, notification);
}
@Override
public void onDestroy() {
super.onDestroy();
if (mClipboardManager != null) {
mClipboardManager.removePrimaryClipChangedListener(
mOnPrimaryClipChangedListener);
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private ClipboardManager.OnPrimaryClipChangedListener mOnPrimaryClipChangedListener =
new ClipboardManager.OnPrimaryClipChangedListener() {
@Override
public void onPrimaryClipChanged() {
String _string =mClipboardManager.getPrimaryClip().getItemAt(0).getText().toString();
logger(_string);
ClipData clip = mClipboardManager.getPrimaryClip();
mThreadPool.execute(new WriteHistoryRunnable(
clip.getItemAt(0).getText()));
}
};
private void logger(String txt){
Log.i("Logger : " , txt);
}
private class WriteHistoryRunnable implements Runnable {
private final CharSequence mTextToWrite;
public WriteHistoryRunnable(CharSequence text) {
mTextToWrite = text;
}
@Override
public void run() {
if (TextUtils.isEmpty(mTextToWrite)) {
// Don't write empty text to the file
return;
}
Log.i("Copyed : ",mTextToWrite.toString() );
String clipboared = mTextToWrite.toString();
//writer.newLine();
//writer.close();
}
}
}
--------------------------------------- MainActivity.java
package com.example.testclipboard;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.app.ActivityManager;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Service;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.hbb20.CountryCodePicker;
public class MainActivity extends AppCompatActivity {
private Intent forService;
ClipboardManager myClipBoard ;
Button btnClick;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
forService = new Intent(MainActivity.this,TestSmallService.class);
btnClick = (Button)findViewById(R.id.btntest);
btnClick.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onClick(View view) {
Log.i("Btn Clicked ","Heyys");
// ToDO : The Old One
Intent intent = new Intent(getBaseContext(), ClipboardMonitorService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
getBaseContext().startForegroundService(intent);
} else {
getBaseContext().startService(intent);
}
}
});
}
}```