我需要监听所有传入和传出的短信并将其存储在文本文件中.为此,我使用广播监听器来监听所有传入的消息.这很好用.但对于传出的短信,如何在没有活动的情况下注册内容观察者?我不希望我的申请中有任何活动.现在广播接收器甚至在重新启动后监听,即使重启后内容观察者也会听?如何合并这两个功能?
这是我的manifest.xml的一部分
<receiver class="map" android:name=".map" android:enabled="true">
<intent-filter>
<action android:value="android.provider.Telephony.SMS_RECEIVED" android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
这里,扩展广播接收器的类
public class map extends BroadcastReceiver {
/** Called when the activity is first created. */
private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";
public void onReceive(Context context, Intent intent)
{
// Here I store the sms in text file
}
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏.谢谢.
我已经实现update()的ContentProvider,并使用通知给观察者getContext().getContentResolver().notifyChange(uri, null);
我显而易见的需要是,每当只有一行生效时我想用行特定的uri通知,但是找不到这样做的方法.一个额外的查询就像"select id where selectionArgs"可以做到这一点,但这将是一个愚蠢的方式.
onchange(boolean, uri)得到完整的uri而不是特定的行,容易理解这是因为ContentProvider.update()发送相同.
some code for more clarity
Run Code Online (Sandbox Code Playgroud)
MyContentProvider的update()方法
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
Log.d("TAG", "update " + uri.getPath());
int count = 0;
switch (uriMatcher.match(uri)) {
case BOOKS:
count = booksDB.update(DATABASE_TABLE, values, selection, selectionArgs);
break;
case BOOK_ID:
count = booksDB.update(DATABASE_TABLE, values,
_ID + " = " + uri.getPathSegments().get(1)
+ (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' …Run Code Online (Sandbox Code Playgroud) 我正在进行联系人备份和同步.
目标是将所有联系人的所有详细信息发送到服务器(定义的自定义协议)作为备份.
在首次启动应用程序期间,所有联系人都将排队并发送到服务器.之后,后台服务将一直运行,将收听新的联系人添加/联系人更新,这个新的/更新的联系人将由后台服务发送到服务器.
我正在使用RawContactsEntity来获取记录.
我尝试ContentObserver在RawContacts/Data表上使用以获取联系人添加或联系人更改的通知.但是,AFAIK,在整个表格中ContentObserver给出onChange()了已更改数据的通知(),而不是单个记录的ID.
现在我的问题是,如何获得更改/新记录的确切ID?
我想创建一个备份表来与本机联系人表进行比较并获取更改的记录.但随着接触次数的增加,性能会急剧下降,这也会妨碍电池的使用寿命.
你能否建议我,从性能和内存使用的角度来看,实现这种联系备份操作的最佳方法是什么?联系人同步操作还有其他方法吗?
如果有人可以分享可以帮助我的例子,将会非常有帮助.
android contacts rawcontacts android-contacts contentobserver
我想阻止短信contentObserver.为此,我想首先获得短信的电话号码.我该怎么做才能获得这个号码?这是我的代码,只计算短信的数量.
package com.SMSObserver4;
import android.app.Activity;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.provider.Contacts;
import android.provider.Contacts.People.Phones;
public class SMSObserver4 extends Activity {
/** Called when the activity is first created. */
private static final String Address = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setReceiver();
}
private SmsSentCounter smsSentObserver = new SmsSentCounter(new Handler());
private int sms_sent_counter = 0;
private void setReceiver() {
this.getContentResolver().registerContentObserver(
Uri.parse("content://sms"), true, smsSentObserver);
}
class SmsSentCounter extends ContentObserver {
public …Run Code Online (Sandbox Code Playgroud) 我正在使用 ContentObserver 来监听联系人数据库中的更改。现在我意识到 onChange() 方法会被随机调用,即使我没有对联系人进行任何更改。我怀疑这在某种程度上与自动联系人同步有关(即使此时联系人没有真正的更改)。
仅当用户对联系人进行实际更改时,才有可能收到通知吗?
谢谢西蒙
public class ContactsObserver extends ContentObserver {
private final static String TAG = ContactsObserver.class.getSimpleName();
private Context ctx;
private List<ContactsChangeListener> listeners = new ArrayList<ContactsChangeListener>();
private ContactsObserver(Context ctx) {
super(new Handler());
this.ctx = ctx.getApplicationContext();
ctx.getContentResolver()
.registerContentObserver(
ContactsContract.Contacts.CONTENT_URI, // uri
false, // notifyForDescendents
this); // observer
}
@Override
public void onChange(boolean selfChange) {
Log.i(TAG, "Contacs change");
for(ContactsChangeListener l : listeners){
l.onContactsChange();
}
}
@Override
public boolean deliverSelfNotifications() {
return false; // set to true does not change …Run Code Online (Sandbox Code Playgroud) 我正在尝试提取已发送的短信.我知道没有BroadcastReciver.所以我发现我可以使用ContentObserver来监听数据库中的更改.
我该如何实现呢?我的目标是只发送新的短信并通过POST在数据库上发送
谢谢
我正在尝试使用内容观察器在我的应用程序中的sqlite数据库发生任何更改时更新服务.
我很困惑该怎么做,所以我把下面的代码放在一起.通常,内容观察者与联系人或媒体播放器一起使用后台服务.在我的研究中,我读到它可以与手机上的sqlite数据库一起使用.
问题:1.由于SQLite数据库没有一个URI,我更换了什么信息People.CONTENT_URI在
this.getContentResolver().registerContentObserver (People.CONTENT_URI, true, contentObserver);
Run Code Online (Sandbox Code Playgroud)
2.在我的研究中,我没有发现任何会进入数据库类的代码会提醒ContentObserver.Content Observer的所有代码都在服务类中工作吗?
请注意,此问题类似于Android SQLite数据库通知以及 如何监听联系人数据库中的更改 这两个问题都没有明确回答我的问题.如果您有解释此问题的代码,那将非常有帮助.
这是我下面的半pusedo代码.这是行不通的.我正在使用它来了解如何在数据库信息更改时更新服务.
package com.example.com.test.content.observer;
import java.sql.Date;
import java.util.Calendar;
import java.util.List;
import com.google.android.gcm.demo.app.Alerts.AlarmsService;
import com.google.android.gcm.demo.app.Alerts.Alerts;
import com.google.android.gcm.demo.app.sqllite.DatabaseSqlite;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.provider.Contacts.People;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.database.ContentObserver;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import android.support.v4.app.NavUtils;
public class AlarmService extends Service
{
Handler mHandler = new Handler();
DatabaseSqlite db = new DatabaseSqlite(this);
List<Alerts> listAlerts; …Run Code Online (Sandbox Code Playgroud) 我实现了历史的内容观察者,但它表现得很奇怪.对于历史中的每个变化,它的onChange()函数运行3-5次.
static class BrowserOberser extends ContentObserver {
public BrowserOberser() {
super(null);
}
@Override
public boolean deliverSelfNotifications() {
return true;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Log.d("History", "onChange: " + selfChange);
}
}
Run Code Online (Sandbox Code Playgroud)
我也用我的观察员注册了
BrowserOberser observer = new BrowserOberser();
getApplication().getContentResolver().registerContentObserver(Browser.BOOKMARKS_URI, true, observer );
Run Code Online (Sandbox Code Playgroud)
并在清单中添加了所需的权限.
代码工作正常,但onChange(); 每次历史变化都会运行3-5次
任何人都可以帮我解决这个问题吗?
我正在构建一个应用程序,用户可以在其中安装此应用程序的设备的联系人(使用phoneNumber)进行交互(几乎是Whatsapp,Viber功能)
现在可以通过函数getContacts()实现此功能
但是,这会在添加/删除联系人或更新现有联系人的情况下导致同步问题
为此,我的知识指导我三种选择
请提供您的见解
我的应用程序在 Process1 中运行,并且我正在使用在 Process2 下运行的另一个应用程序提供的内容提供程序。当 Process2 终止时,会导致在 Process1 下运行的我的应用程序被终止。
09-14 23:31:52.583 782 1351 I ActivityManager: Killing 11797:com.example.myapp/1000 (adj 100): depends on provider com.example.exampleapp/com.example.exampleapp.MyContentProvider in dying proc com.example.exampleapp (adj 100)
09-14 23:31:52.585 782 812 W libprocessgroup: kill(-11797, 9) failed: No such process
09-14 23:31:52.585 782 812 I libprocessgroup: Successfully killed process cgroup uid 1000 pid 11797 in 0ms
09-14 23:31:52.623 368 368 I Zygote : Process 11797 exited due to signal (9)
Run Code Online (Sandbox Code Playgroud)
我在 SO 中遇到了这个很好的答案,它基本上解释了当我们对内容提供商进行内容观察者与查询时会发生什么。
但我不清楚为什么 android 会杀死整个过程。为什么不能在应用程序级别处理这个问题,DeadObjectException …
android android-contentprovider contentobserver android-activitymanager contentproviderclient
android ×10
contentobserver ×10
sms ×3
contacts ×2
sqlite ×2
browser ×1
phone-number ×1
rawcontacts ×1
service ×1