javascript

java

python

c#

android

node.js

c++

reactjs

php

html

jquery

css

.net

ios

git

ruby-on-rails

sql

c

string

ruby

在Android本机来电屏幕上弹出窗口,例如真正的来电者Android应用

我正在为Android中的来电开发广播接收器,并且在收到来电时,我想在本机来电屏幕上弹出一个弹出窗口。

我完成了该代码。 但是现在的问题是,在电话响起的Android 4.1(Jelly Bean)API级别17中,PHONE_STATE即将变成OFF HOOK,如果我正在调用一个活动,它会被调用,但是它下面的代码却不会 被执行。 我正在列出代码:

我的广播接收器

package com.example.popwindowonincomingcallscreen;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;

public class IncomingBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Log.d("IncomingBroadcastReceiver: onReceive: ", "flag1");

        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        Log.d("IncomingBroadcastReceiver: onReceive: ", state);
        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)
                || state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {

            Log.d("Ringing", "Phone is ringing");

            Intent i = new Intent(context, IncomingCallActivity.class);
            i.putExtras(intent);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            Wait.oneSec();
            context.startActivity(i);
        }
    }
}

我正在调用的活动:

import android.app.Activity;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View.MeasureSpec;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;

public class IncomingCallActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        try {
            Log.d("IncomingCallActivity: onCreate: ", "flag2");

            */ After this line, the code is not executed in Android 4.1 (Jelly Bean) only/*

            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);

            getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
            getWindow().addFlags(
                    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);

            Log.d("IncomingCallActivity: onCreate: ", "flagy");

            setContentView(R.layout.main);

            Log.d("IncomingCallActivity: onCreate: ", "flagz");

            String number = getIntent().getStringExtra(
                    TelephonyManager.EXTRA_INCOMING_NUMBER);
            TextView text = (TextView) findViewById(R.id.text);
            text.setText("Incoming call from " + number);
        } 
        catch (Exception e) {
            Log.d("Exception", e.toString());
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

try {
    Log.d("IncomingCallActivity: onCreate: ", "flag2");
}

该代码未在Android 4.1(Jelly Bean)中执行,但在其他版本中仍可运行。

我已经尝试了几乎所有方法。 该代码在本机呼叫屏幕上显示了半透明的活动,并且不会阻止后台控件,例如接听电话。 但我希望它像真正的呼叫者一样。 我已附上快照,以了解真正的呼叫者如何在来电屏幕上显示窗口。

如何为Android应用程序实现此功能?

真正的呼叫者是这样工作的:

Enter image description here

我现在的输出:

Enter image description here

更新1

赏金后,我也没有得到想要的确切东西,但是我会回到一切。 我正在努力。 无论如何,此代码适用于大多数Android手机。 如果有人要使用并赶上解决方案,请在此处写下,以便每个人都能从中受益。

更新2

我尝试在广播接收器的onReceive方法中实现Toast,因为toast是Android的本机组件,但也未在Android 4.1(Jelly Bean)中显示。

我的想法是在广播接收机的onReceive方法中实现Toast,然后根据我们的需求更改其设计并调整其显示时间。 但是还有一个问题是findViewById在广播接收器中不起作用,所以我认为我们必须以编程方式制作LinearLayout来定制吐司。

trans by 2020-02-22T04:43:40Z

broadcastreceiver-在Android中重启设备后广播接收器无法正常工作

我已经检查了所有相关问题,还没有找到解决该问题的方法。 所以这对我来说是一个绝对新的问题。

我有的

我有一个Android应用,该应用在其清单中注册了一些广播接收器。 这就是我的清单。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.app.myapp">

    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.USE_FINGERPRINT" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <uses-permission android:name="android.permission.WRITE_CALL_LOG" />
    <uses-permission android:name="com.android.vending.BILLING" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />

    <uses-feature
        android:name="android.hardware.telephony"
        android:required="false" />

    <uses-feature
        android:name="android.hardware.screen.portrait"
        android:required="false" />

    <application
        android:name=".base.MyApp"
        android:allowBackup="false"
        android:icon="@drawable/ic_launcher"
        android:label="@string/label_app_name"
        android:largeHeap="true"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:replace="label, allowBackup">

        <receiver android:name=".mics.BootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>
        </receiver>

        <receiver android:name=".PhoneCallReceiver">
            <intent-filter>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
        </receiver>

        <receiver
            android:name=".mics.DeviceAdminReceiver"
            android:permission="android.permission.BIND_DEVICE_ADMIN">
            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>

            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/device_admin" />
        </receiver>

        <receiver
            android:name="com.clevertap.android.sdk.InstallReferrerBroadcastReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="com.android.vending.INSTALL_REFERRER" />
            </intent-filter>
        </receiver>

        <meta-data
            android:name="com.app.myapp.utils.ImageLoaderModule"
            android:value="GlideModule" />

        <meta-data
            android:name="com.app.myapp.utils.AudioCoverLoaderModule"
            android:value="GlideModule" />

        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">

            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

        <activity
            android:name=".core.activities.SplashActivity"
            android:excludeFromRecents="true"
            android:label="@string/label_app_name"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
            </intent-filter>
        </activity>

        <activity-alias
            android:name=".core.activities.SplashActivity-Alias"
            android:icon="@drawable/ic_launcher"
            android:label="@string/label_app_name"
            android:noHistory="true"
            android:targetActivity="com.app.myapp.core.activities.SplashActivity">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.MONKEY" />
            </intent-filter>

        </activity-alias>

        <activity
            android:name=".core.flow.authFlow.activities.AuthFlowActivity"
            android:excludeFromRecents="true"
            android:label="@string/label_app_name"
            android:screenOrientation="portrait" />

        <service android:name=".features.fileCloudSync.KillNotificationService" />

    </application>

</manifest>

还有10-15个其他活动,但为简单起见已将其删除。 这是基本的启动接收器类。 我从这里开始服务。

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            AlertUtils.showToast(context, "BOOT COMPLETED", Toast.LENGTH_LONG);
        }
    }
}

电话接听器类看起来像这样(它也已经简化了),

public class PhoneCallReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
            AlertUtils.showToast(context, "PHONE CALL RECEIVED", Toast.LENGTH_LONG);
            // Simplified for brevity
        }
    }
}

问题

当我安装应用程序并启动一次时,所有这些接收器都可以正常工作。 但是,在我重启设备后,这些接收器根本无法工作。 BootCompleteReceiverBootCompleteReceiver都没有调用其PhoneCallReceiver方法。

我的假设是,这些接收器将在重新启动后自动注册,但这根本不起作用。 我需要BootCompleteReceiver才能工作,以便可以在我的应用程序中启动重要的服务。

我的观察

我已经对此进行了彻底的测试。 重新启动设备后,接收器可以在我的Nexus 5X(牛轧糖),Nexus 6P(牛轧糖),Yu Yuphoria(棒棒糖)中正常工作,但在我的OnePlus 3(牛轧糖)和Mi 4i(棒棒糖)中无法正常工作。

同一代码如何在少数设备上完美工作而在其他设备上根本不工作? 我什么都没改变。

我在这里做错了什么? 我的应用严重依赖这些广播,并基于这些广播启动服务。 任何帮助将不胜感激。

编辑1

为了更好地理解该问题,我创建了一个非常小的测试项目,仅包含一个活动,并且完全相同。BootCompleteReceiverPhoneCallReceiver

但是奇怪的是,该项目在我的OnePlus 3上完美运行,在重启后我的实际应用程序的接收器无法正常工作。 最初我以为问题出在操作系统或设备上,但事实并非如此。

那么实际问题在哪里呢? 是在我的应用程序中(但它可以在其他设备上完美运行)还是在操作系统和设备中(小型测试项目在相同的操作系统和相同的设备上正常运行)?

这真让我感到困惑。 我将需要一些专家帮助。

编辑2

我尝试了@shadygoneinsane的建议。 这是我的观察。

1)我试图通过ADB发送BOOT_COMPLETED广播。

./adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -p com.app.myapp

我得到了这个堆栈跟踪

Broadcasting: Intent { act=android.intent.action.BOOT_COMPLETED pkg=com.app.myapp }
java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.BOOT_COMPLETED from pid=25378, uid=2000
    at android.os.Parcel.readException(Parcel.java:1683)
    at android.os.Parcel.readException(Parcel.java:1636)
    at android.app.ActivityManagerProxy.broadcastIntent(ActivityManagerNative.java:3696)
    at com.android.commands.am.Am.sendBroadcast(Am.java:778)
    at com.android.commands.am.Am.onRun(Am.java:404)
    at com.android.internal.os.BaseCommand.run(BaseCommand.java:51)
    at com.android.commands.am.Am.main(Am.java:121)
    at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
    at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:276)

可能是因为我的设备未植根。 我无法以任何方式发送此广播。

2)之后,我尝试播放PROCESS_OUTGOING_CALLS。

./adb shell am broadcast -a android.intent.action.PROCESS_OUTGOING_CALLS -p com.app.myapp

我懂了,

Broadcasting: Intent { act=android.intent.action.PROCESS_OUTGOING_CALLS pkg=com.app.myapp }
Broadcast completed: result=0

广播似乎成功了,但是我看不到任何Toast或任何日志。 然后,我打开拨号器拨打号码,然后可以看到Toast和日志。

因此,似乎似乎无法通过ADB发送广播,但是实际上打开了拨号器并拨打了一个号码。

编辑3

根据@ChaitanyaAtkuri的建议,我也尝试过为intent-filters添加优先级,但是效果不佳。

我使用了优先级,例如500、999甚至最高整数值,但没有任何效果。 我的一些朋友应用程序中也出现了此问题。 它们只能在某些设备上工作,而不能在其他设备上工作。

编辑4

我终于找到了在OnePlus 3中发生问题的根本原因。我的OnePlus 3最近更新为Nougat,他们引入了类似于Mi设备的功能,可以防止某些应用在重启后自动启动。

禁用此功能后,我的应用完美重启后就开始接收广播。 但这仍然不能解释两件事。

1)我的小型测试项目在AutoLaunch应用程序列表中自动列入白名单,这就是为什么它能按预期工作的原因。 但这怎么可能呢? 为什么操作系统认为值得自动启动的小型应用程序?

2)有一些应用程序,例如LockDown Pro,500 Firepaper,这些应用程序已在AutoLaunch应用程序屏幕中列入黑名单,但仍然可以在我的OnePlus 3和Mi 4i中重新启动后接收广播。 现在怎么可能? 是否可以通过编程方式允许我的应用在这些设备(OnePlus和Mi)中自动启动?

编辑5

我尝试了@Rahul Chowdhury提出的解决方案,它似乎确实工作得很好。 添加可访问性服务后,该问题得以重新解决。

但是,如果用户在授予权限后撤消了可访问性权限,那么我是否可以通过程序检查可访问性权限是否适用于我的应用程序?

trans by 2020-02-21T10:09:19Z

android-活动泄漏了IntentRecei

我正在尝试一起发送短信和邮件。 发送邮件没有问题,但是当我发送短信时,我收到此异常:

End has leaked IntentReceiver
Are you missing a call to unregisterReceiver()? 

这是我的sms方法代码:

public class End extends Activity {

    Button btnSendSMS;
    EditText txtPhoneNo;
    EditText txtMessage;
    public EditText Details;
    public String user;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.end);
        Details = (EditText)findViewById(R.id.details);
        btnSendSMS = (Button) findViewById(R.id.btnSend);
        Bundle b=this.getIntent().getExtras();
        final String email=b.getString("keym");
        final String pno=b.getString("keys");

        btnSendSMS.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {           
                String detail=Details.getText().toString();
                Mail m = new Mail("abc@gmail.com", "sdfsa"); 
                String[] toArr = {email}; 
                m.setTo(toArr); 
                m.setFrom("asdasd11@gmail.com"); 
                m.setSubject("EMERGENCY");
                m.setBody(detail);

                try { 
                    // m.addAttachment("/sdcard/filelocation"); 
                    if(m.send()) { 
                    Toast.makeText(End.this, "Email was sent successfully.", Toast.LENGTH_LONG).show(); 
                    } else { 
                  Toast.makeText(End.this, "Email was not sent.", Toast.LENGTH_LONG).show(); 
                    } 
                } catch(Exception e) { 
                //Toast.makeText(MailApp.this, "There was a problem sending the email.", Toast.LENGTH_LONG).show(); 
                Log.e("MailApp", "Could not send email", e); 
                } 

                sendSMS(pno, detail);
                finish();
                Intent intent = new Intent(End.this,Service.class);
                startActivity(intent);
               }   
            }
        );        

    } 

    private void sendSMS(String phoneNumber, String message)
    {        
         String SENT = "SMS_SENT";
         String DELIVERED = "SMS_DELIVERED";

         PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
             new Intent(SENT), 0);

         PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
             new Intent(DELIVERED), 0);

         //---when the SMS has been sent---
         registerReceiver(new BroadcastReceiver()
         {
             Context context;
             @Override
             public void onReceive(Context arg0, Intent arg1) {
                 switch (getResultCode())
                 {
                     case Activity.RESULT_OK:
                         Toast.makeText(getBaseContext(), "SMS sent", 
                                 Toast.LENGTH_SHORT).show();
                         break;
                     case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                         Toast.makeText(getBaseContext(), "Generic failure", 
                                 Toast.LENGTH_SHORT).show();
                         break;
                     case SmsManager.RESULT_ERROR_NO_SERVICE:
                         Toast.makeText(getBaseContext(), "No service", 
                                 Toast.LENGTH_SHORT).show();
                         break;
                     case SmsManager.RESULT_ERROR_NULL_PDU:
                         Toast.makeText(getBaseContext(), "Null PDU", 
                                 Toast.LENGTH_SHORT).show();
                         break;
                     case SmsManager.RESULT_ERROR_RADIO_OFF:
                         Toast.makeText(getBaseContext(), "Radio off", 
                                 Toast.LENGTH_SHORT).show();
                         break;
                 }


             }
         }, new IntentFilter(SENT));

         //---when the SMS has been delivered---
         registerReceiver(new BroadcastReceiver(){
             Context context;
             @Override

             public void onReceive(Context arg0, Intent arg1) 
             {
                 switch (getResultCode())
                 {
                     case Activity.RESULT_OK:
                         Toast.makeText(getBaseContext(), "SMS delivered", 
                                 Toast.LENGTH_SHORT).show();
                         break;
                     case Activity.RESULT_CANCELED:
                         Toast.makeText(getBaseContext(), "SMS not delivered", 
                                 Toast.LENGTH_SHORT).show();
                         break;                        
                 }

             }
         }, new IntentFilter(DELIVERED));        

         SmsManager sms = SmsManager.getDefault();
         sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);    

}

}

trans by 2020-01-28T06:52:09Z

android-如何从上下文中获取视图?

我想从上下文中获取视图或findViewById()?还是出于意图?

我正在尝试在广播接收器中达到特定的视图,并且onReceive的参数是上下文和意图。

好吧,我有一堂课,里面是我的广播接收器。 现在,我试图将广播接收器与之分离,但是我需要一种方法,以便仍可以与分离的广播接收器类中的类视图进行通信。

谢谢。

trans by 2020-01-27T00:09:39Z

android-接收软件包安装和卸载事件

我试图检测何时安装了新的应用程序,但仅当我的应用程序正在运行时。 我设法制作了BroadcastReceiver并在AndroidManifest文件中激活了它,从而检测到该应用程序的安装,但这即使我的应用程序已关闭也能检测到。因此,这就是为什么我需要手动激活和停用broadcastreveiver的原因。 为此,我有以下代码:

br = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Log.i("Enter", "Enters here");
        Toast.makeText(context, "App Installed!!!!.", Toast.LENGTH_LONG).show();
    }
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
intentFilter.addAction(Intent.ACTION_PACKAGE_INSTALL);
registerReceiver(br, intentFilter);

安装新的应用程序时,这应该会敬酒。 但是遗憾的是事实并非如此。 它不输入onReceive方法。 任何帮助表示赞赏。

trans by 2020-01-21T20:17:50Z

Android-短信广播接收

我一直在尝试使该程序正常运行,但到目前为止还没有运气。 我找不到我做错了的地方。 我不确定代码或调试是否有问题。

我正在尝试收到新短信的通知。

这是我的程序:

package Technicaljar.SMSBroadcastReceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;

public class SMSBroadcastReceiver extends BroadcastReceiver {

        private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
        private static final String TAG = "SMSBroadcastReceiver";

        @Override
        public void onReceive(Context context, Intent intent) {
             Log.i(TAG, "Intent recieved: " + intent.getAction());

                if (intent.getAction() == SMS_RECEIVED) {
                    Bundle bundle = intent.getExtras();
                    if (bundle != null) {
                        Object[] pdus = (Object[])bundle.get("pdus");
                        final SmsMessage[] messages = new SmsMessage[pdus.length];
                        for (int i = 0; i < pdus.length; i++) {
                            messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
                        }
                        if (messages.length > -1) {
                            Log.i(TAG, "Message recieved: " + messages[0].getMessageBody());
                        }
                    }
                }
           }
    }

和清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="Technicaljar.SMSBroadcastReceiver"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true" >
        <receiver android:name=".SMSBroadcastReceiver">
            <intent-filter>
                <action android:name="android.provider.telephony.SMS_RECEIVED"></action>
            </intent-filter>
        </receiver>

    </application>
    <uses-sdk android:minSdkVersion="7" />
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
</manifest> 

我正在通过Telnet发送SMS,并且在Logcat中看不到任何Intent收到的消息。 这是我安装时的日志。

D/AndroidRuntime(  478): 
D/AndroidRuntime(  478): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
D/AndroidRuntime(  478): CheckJNI is ON
D/AndroidRuntime(  478): --- registering native functions ---
D/AndroidRuntime(  478): Shutting down VM
D/dalvikvm(  478): Debugger has detached; object registry had 1 entries
I/AndroidRuntime(  478): NOTE: attach of thread 'Binder Thread #3' failed
D/Mms:app (  220): getSmsNewMessageNotificationInfo: count=14, first addr=12345, thread_id=4
D/dalvikvm(  151): GC_EXPLICIT freed 391 objects / 22552 bytes in 65ms
D/dalvikvm(  220): GC_EXPLICIT freed 926 objects / 44840 bytes in 73ms

因此,SMS似乎已被仿真器接收到,但似乎没有意图。我在这里做错了什么? 安装后,我是否必须以某种方式“启动”此接收器?因为当我安装时,我得到

 [2010-11-07 21:24:41 - SMSBroadcastReceiver] No Launcher activity found!
[2010-11-07 21:24:41 - SMSBroadcastReceiver] The launch will only sync the application package on the device!

所以我想知道这里是否有问题。

trans by 2020-01-21T00:54:43Z

Android BroadcastReceiver在启动时-当Activity在后台时保持运行

我正在监视传入的SMS。

我的应用程序可以与2709043670480480847872完美配合。但是,它正在通过Activity运行,并且希望一直保持onReceive始终运行(而不仅仅是在我的Activity运行时)。

我该如何实现? 我已经查看了BroadcastReceiver的生命周期,但是文档中提到的全部是生命周期仅限于onReceive方法,而不是保持BroadcastReceiver检查传入SMS的生命周期。

我如何使它持久化?

谢谢

trans by 2020-01-19T04:48:28Z

多线程-Android BroadcastReceiver还是简单的回调方法?

在我的项目中,我将BroadcastReceivers用作长时间运行的线程的回调(例如,通知活动下载已完成,并从Worker Service发送一些响应数据,以便活动可以向用户显示适当的消息。) 。要使用26839271847847334082s,我必须在每次使用广播接收器时都进行谨慎的注册和注销,并且在使用此方法执行更多不同的操作(例如下载,进行WebService调用等)时,还必须特别注意要发送哪些消息。 ..)。 另外,还要通过广播的意图发送自定义对象,我还需要制作对象Thread

与这种方法不同,我还看到了回调方法,该方法似乎比我使用的方法更简单。 回调方法是简单的接口方法实现,可用于实现与BroadcastRecaiver在应用程序消息传递中相同的效果。这种方法不需要Parcelable实现即可返回复杂的对象,并且它不使用诸如BroadcastReceiver之类的键。 并确保我正在UI线程上的实现中运行代码,以便可以无错误地更新UI。

好的,希望您能理解我的意思:)。

现在的问题是,当您仅在单个应用程序中使用回调方法时,您认为它比26839271847163340340方法更好(更轻,更干净,更快..)吗? (请注意,我没有将Android Service用于后台工作。只是AsyncTaskThreads)

谢谢!

trans by 2020-01-01T20:57:31Z

android:屏幕和屏幕上的广播接收器

我只是想知道是否可以在应用程序清单中注册检测屏幕开/关的广播接收器。我不喜欢可编程方法的原因是,它需要运行应用程序才能检测到这种情况,而:“广播Intent以便接收者执行时,不必运行清单中已注册广播接收者的应用程序”(来源:Professional Android 2 Application Development book)

我的应用程序实际上是一个锁屏应用程序,它需要使用可编程方式一直运行:S

有办法解决吗?

我正在清单中尝试以下操作:

<receiver android:name=".MyBroadCastReciever">
    <intent-filter>
        <action android:name="android.intent.action.SCREEN_OFF"/>
        <action android:name="android.intent.action.SCREEN_ON"/>
    </intent-filter>
</receiver>

和简单的BroadCastReceiver类:

public class MyBroadCastReciever extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            Log.i("Check","Screen went OFF");
            Toast.makeText(context, "screen OFF",Toast.LENGTH_LONG).show();
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            Log.i("Check","Screen went ON");
            Toast.makeText(context, "screen ON",Toast.LENGTH_LONG).show();
        }
    }
}
trans by 2019-10-09T18:04:58Z

android-服务意图必须明确:意图

我现在有一个应用程序,通过广播接收器(MyStartupIntentReceiver)调用服务。 为了调用该服务,广播接收器中的代码是:

public void onReceive(Context context, Intent intent) {
    Intent serviceIntent = new Intent();
    serviceIntent.setAction("com.duk3r.eortologio2.MyService");
    context.startService(serviceIntent);
}

问题是,在Android 5.0 Lollipop中,出现以下错误(在早期版本的Android中,一切正常):

Unable to start receiver com.duk3r.eortologio2.MyStartupIntentReceiver: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.duk3r.eortologio2.MyService }

为了将服务声明为显式且正常启动,我必须更改什么? 在其他类似线程中尝试了一些答案,但是尽管我摆脱了该消息,但该服务无法启动。

trans by 2019-10-08T18:34:09Z

android-如何确定我的活动之一是否在前台

这个问题在这里已有答案:

  • 检查Android应用程序是否在后台运行                                     29个答案

我已经实现了由AlarmManager触发的BroadcastReceiver。 AlarmManager在BOOT_COMPLETED上初始化。 因此,我必须在清单中声明接收方。

我的问题是,我只希望在我自己的活动都不在前台(也就是用户未与我的应用程序进行交互)时才执行BroadcastReceiver。 我从远程服务器提取信息,并且无论如何都不想通知用户。

到目前为止,我还没有找到一种方法来确定我的应用程序是否在前台。 有办法做这种事吗? ActivityManager会告诉我我的应用程序是否正在运行,但不会告诉我它是否在前台。

问题与这里描述的几乎相同:仅当它在前台时才从BroadcastReceiver通知活动

解:

在评估了几种解决方案之后,我想快速概述一下我认为是处理背景/前景活动的最佳方法。

首选方法是在活动的onResume方法中注册广播接收器,并在onPause的活动中注销它。 任何服务或其他背景元素都将需要发送广播意图,其中包含您的活动将拦截的特定操作。

如果您的活动处于前台,它将注册其意图接收器,并能够直接处理您的服务发送的意图。 如果它不在前台,它将不会接收到该意图,但是调用广播的服务将知道没有人截获其广播意图,并且能够自行处理。 例如,它可以启动所需的活动,显示通知等。

trans by 2019-10-08T09:09:58Z

Android,检测其他应用程序何时启动

我正在尝试开发一个应用程序,防止用户在没有密码的情况下访问指定的应用程序。 情景是......

  1. 用户点击“电子邮件”应用(例如)
  2. 我的应用检测到应用的启动
  3. 我的应用程序确认它是“电子邮件”应用程序
  4. 我的应用程序在顶部打开一个视图,要求输入密码
  5. 用户输入密码,如果正确,我的应用程序将消失,将“电子邮件”应用程序保留在最顶层

我正在做剩下的事情,只是第2部分令我感到困惑,经过多天阅读广播意图等并试图在我的试验项目中听“android.intent.action.MAIN”等我不能 似乎检测到我的应用程序何时启动。

有人可以帮忙吗? 我是否正确地寻找新的应用程序广播意图启动,或者我应该阅读系统日志以获取新意图,或者使用本机代码执行某些操作?

任何指针都会有所帮助,即使你无法完全回答它,我也可以做更多的研究。 非常感谢。伊恩

trans by 2019-09-10T22:14:27Z

java - Android - 在b上启动服务

从我在Stack Exchange和其他地方看到的所有内容中,我已经正确设置了所有内容,以便在Android OS启动时启动IntentService。 不幸的是,它不是在启动时启动,而且我没有收到任何错误。 也许专家可以提供帮助......

表现:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.phx.batterylogger"
  android:versionCode="1"
  android:versionName="1.0"
  android:installLocation="internalOnly">

<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BATTERY_STATS" />

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <service android:name=".BatteryLogger"/>
    <receiver android:name=".StartupIntentReceiver">  
        <intent-filter>  
            <action android:name="android.intent.action.BOOT_COMPLETED" />  
        </intent-filter>  
    </receiver>
</application>

</manifest>

BroadcastReceiver for Startup:

package com.phx.batterylogger;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class StartupIntentReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent serviceIntent = new Intent(context, BatteryLogger.class);
        context.startService(serviceIntent);
    }
}

更新:我尝试了下面的所有建议,并且我将诸如Log.v("BatteryLogger", "Got to onReceive, about to start service");的日志记录添加到StartupIntentReceiver的onReceive处理程序中,并且没有记录任何内容。 所以它甚至没有进入BroadcastReceiver。

我想我正在部署APK并正确测试,只需在Eclipse中运行Debug,控制台就说它成功将它安装到我的Xoom平板电脑\ BatteryLogger \ bin \ BatteryLogger.apk。 然后进行测试,我重新启动平板电脑,然后查看DDMS中的日志,并在操作系统设置中检查正在运行的服务。 这听起来是否正确,或者我错过了什么? 再次,非常感谢任何帮助。

trans by 2019-08-25T13:33:53Z

android - 有多个过滤器或多个BroadcastReceivers的BroadcastReceiver?

我有一个需要捕获两个不同广播的Android活动。 我目前的方法是在Activity中有一个onCreate并用它来捕获两个广播:

public class MyActivity extends Activity {
    private MyActivity.BroadcastListener mBroadcastListener;
    private boolean mIsActivityPaused = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mylayout);

        // Create the broadcast listener and register the filters
        mIsActivityPaused = false;
        mBroadcastListener = new BroadcastListener();

        IntentFilter filter = new IntentFilter();
        filter.addAction(Params.INTENT_REFRESH);
        filter.addAction(Params.INTENT_UPDATE);
        registerReceiver(mBroadcastListener, filter);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mIsActivityPaused = false;
    }

    @Override
    protected void onPause() {
        super.onPause();
        mIsActivityPaused = true;
    }

    @Override
    protected void onDestroy() {
        unregisterReceiver(mBroadcastListener);
        super.onDestroy();
    }

    private void refresh() {
        // refresh
    }

    private void update() {
        // update
    }

    private class BroadcastListener extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Params.INTENT_REFRESH && !mIsActivityPaused)) {
                refresh();
            } else if (intent.getAction().equals(Params.INTENT_UPDATE)) {
                update();
            }
        }
    }
}

我想仅在我的活动在屏幕上可见时执行onCreate,但我想在活动的整个生命周期内捕获INTENT_REFRESH并执行update(),无论活动是否可见。

我没有找到任何方法只注销我在onCreate中注册的两个过滤器中的一个,所以我使用一个标志来启用或禁用捕获INTENT_REFRESH广播时要执行的操作,具体取决于活动的状态。

问题是:这是正确的方法吗?

或者,最好有两个单独的BroadcastReceivers,如下所示:

public class MyActivity extends Activity {
    private MyActivity.BroadcastListenerRefresh mBroadcastListenerRefresh;
    private MyActivity.BroadcastListenerUpdate mBroadcastListenerUpdate;
    private boolean mIsBroadcastListenerRefreshRegistered = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Create the broadcast listeners
        mBroadcastListenerRefresh = new BroadcastListenerRefresh();
        mBroadcastListenerUpdate = new BroadcastListenerUpdate();

        registerReceiver(mBroadcastListenerRefresh, new IntentFilter(Params.INTENT_REFRESH));
        registerReceiver(mBroadcastListenerUpdate, new IntentFilter(Params.INTENT_UPDATE));
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mBroadcastListenerRefresh != null && !mIsBroadcastListenerRefreshRegistered) {
            registerReceiver(mBroadcastListenerRefresh, new IntentFilter(Params.INTENT_REFRESH));
            mIsBroadcastListenerRefreshRegistered = true;
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mBroadcastListenerRefresh != null && mIsBroadcastListenerRefreshRegistered) {
            unregisterReceiver(mBroadcastListenerRefresh);
            mIsBroadcastListenerRefreshRegistered = false;
        }
    }

    @Override
    protected void onDestroy() {
        unregisterReceiver(mBroadcastListenerRefresh);
        unregisterReceiver(mBroadcastListenerUpdate);
        super.onDestroy();
    }

    private void refresh() {
        // refresh
    }

    private void update() {
        // update
    }

    private class BroadcastListenerRefresh extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Params.INTENT_REFRESH)) {
                refresh();
            }
        }
    }

    private class BroadcastListenerUpdate extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Params.INTENT_UPDATE)) {
                update();
            }
        }
    }
}

哪一个有更好的表现?

trans by 2019-08-05T00:16:08Z

android - Receiver没有注册异常错误?

在我的开发者控制台中,人们不断报告我无法在任何手机上重现的错误。 一个人留言说他在试图打开我的电池服务的设置屏幕时得到它。 从错误中可以看出,它表示接收器未注册。

java.lang.RuntimeException: Unable to stop service .BatteryService@4616d688:  java.lang.IllegalArgumentException: Receiver not registered: com.app.notifyme.BatteryService$BatteryNotifyReceiver@4616d9d0
at android.app.ActivityThread.handleStopService(ActivityThread.java:3164)
at android.app.ActivityThread.access$3900(ActivityThread.java:129)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2173)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:4701)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: Receiver not registered:com..BatteryService$BatteryNotifyReceiver@4616d9d0
at android.app.ActivityThread$PackageInfo.forgetReceiverDispatcher(ActivityThread.java:805)
at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:859)
at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331)
at com.app.notifyme.BatteryService.onDestroy(BatteryService.java:128)
at android.app.ActivityThread.handleStopService(ActivityThread.java:3150)

我注册的是我的onCreate

@Override
public void onCreate(){
    super.onCreate();
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
    IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    filter.addAction(Intent.ACTION_POWER_CONNECTED);
    filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
    registerReceiver(batteryNotifyReceiver,filter);
    pref.registerOnSharedPreferenceChangeListener(this);
}

取消注册onDestroy以及首选项侦听器

    @Override
public void onDestroy(){
    super.onDestroy();
    unregisterReceiver(batteryNotifyReceiver);

}

这是我服务的接收者

private final class BatteryNotifyReceiver extends BroadcastReceiver {

    boolean connected;
    @Override
    public void onReceive(Context context, Intent intent) {

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 
        SharedPreferences.Editor edit = prefs.edit();

            updatePreferences(prefs);

        level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);



        if(intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)){
            connected = true;
        }else if(intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)){
            connected = false;
        }else if(intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)){

                if(level < lastLevel){
                    if(level > 40){
                        edit.putBoolean("first", false).commit();
                        edit.putBoolean("second", false).commit();
                        edit.putBoolean("third", false).commit();
                       edit.putBoolean("fourth",false).commit();                            
                        edit.putBoolean("fifth", false).commit();
                    }
                    if(level == 40){
                        if(!first){
                        notification(context,battColor,battBlink,battVib,battSound);

                        edit.putBoolean("first", true).commit();
                        }
                    }else if(level == 30){
                        if(!second){
                        notification(context,battColor,battBlink,battVib,battSound);

                        edit.putBoolean("second", true).commit();
                        }
                    }else if(level == 20){
                        if(!third){
                        notification(context,battColor,battBlink,battVib,battSound);

                        edit.putBoolean("third", true).commit();
                        }
                    }else if(level == 15){
                        if(!fourth){
                        notification(context,battColor,battBlink,battVib,battSound);

                        edit.putBoolean("fourth", true).commit();
                        }
                    }else if(level == 5){
                        if(!fifth){
                        notification(context,battColor,battBlink,battVib,battSound);

                        edit.putBoolean("fifth", true).commit();
                        }
                    }
                lastLevel = temp;
            }
        }           

        Intent i = new Intent(context,BatteryNotifyReceiver.class);
        context.startService(i);
    }       
}

知道他们为什么会得到那个错误吗?

trans by 2019-07-17T13:04:22Z

在Android中发送和接收短信和彩信(pre Kit Kat Android 4.4)

我已经弄明白了如何发送和接收短信。 要发送短信,我不得不拨打You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order.getMMSApns()类的getMMSApns()方法。 要接收SMS消息,我必须在ContentObserver文件中注册接收器。 然后我不得不覆盖BroadcastReceiveronReceive()方法。我在下面列举了一些例子。

MainActivity.java

public class MainActivity extends Activity {
    private static String SENT = "SMS_SENT";
    private static String DELIVERED = "SMS_DELIVERED";
    private static int MAX_SMS_MESSAGE_LENGTH = 160;

    // ---sends an SMS message to another device---
    public static void sendSMS(String phoneNumber, String message) {

        PendingIntent piSent = PendingIntent.getBroadcast(mContext, 0, new Intent(SENT), 0);
        PendingIntent piDelivered = PendingIntent.getBroadcast(mContext, 0,new Intent(DELIVERED), 0);
        SmsManager smsManager = SmsManager.getDefault();

        int length = message.length();          
        if(length > MAX_SMS_MESSAGE_LENGTH) {
            ArrayList<String> messagelist = smsManager.divideMessage(message);          
            smsManager.sendMultipartTextMessage(phoneNumber, null, messagelist, null, null);
        }
        else
            smsManager.sendTextMessage(phoneNumber, null, message, piSent, piDelivered);
        }
    }

    //More methods of MainActivity ...
}

SMSReceiver.java

public class SMSReceiver extends BroadcastReceiver {
    private final String DEBUG_TAG = getClass().getSimpleName().toString();
    private static final String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
    private Context mContext;
    private Intent mIntent;

    // Retrieve SMS
    public void onReceive(Context context, Intent intent) {
        mContext = context;
        mIntent = intent;

        String action = intent.getAction();

        if(action.equals(ACTION_SMS_RECEIVED)){

            String address, str = "";
            int contactId = -1;

            SmsMessage[] msgs = getMessagesFromIntent(mIntent);
            if (msgs != null) {
                for (int i = 0; i < msgs.length; i++) {
                    address = msgs[i].getOriginatingAddress();
                    contactId = ContactsUtils.getContactId(mContext, address, "address");
                    str += msgs[i].getMessageBody().toString();
                    str += "\n";
                }
            }   

            if(contactId != -1){
                showNotification(contactId, str);
            }

            // ---send a broadcast intent to update the SMS received in the
            // activity---
            Intent broadcastIntent = new Intent();
            broadcastIntent.setAction("SMS_RECEIVED_ACTION");
            broadcastIntent.putExtra("sms", str);
            context.sendBroadcast(broadcastIntent);
        }

    }

    public static SmsMessage[] getMessagesFromIntent(Intent intent) {
        Object[] messages = (Object[]) intent.getSerializableExtra("pdus");
        byte[][] pduObjs = new byte[messages.length][];

        for (int i = 0; i < messages.length; i++) {
            pduObjs[i] = (byte[]) messages[i];
        }
        byte[][] pdus = new byte[pduObjs.length][];
        int pduCount = pdus.length;
        SmsMessage[] msgs = new SmsMessage[pduCount];
        for (int i = 0; i < pduCount; i++) {
            pdus[i] = pduObjs[i];
            msgs[i] = SmsMessage.createFromPdu(pdus[i]);
        }
        return msgs;
    }

    /**
    * The notification is the icon and associated expanded entry in the status
    * bar.
    */
    protected void showNotification(int contactId, String message) {
        //Display notification...
    }
}

AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myexample"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_MMS" />
    <uses-permission android:name="android.permission.WRITE" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:debuggable="true"
        android:icon="@drawable/ic_launcher_icon"
        android:label="@string/app_name" >

        <activity
            //Main activity...
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            //Activity 2 ...
        </activity>
        //More acitivies ...

        // SMS Receiver
        <receiver android:name="com.myexample.receivers.SMSReceiver" >
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

    </application>
</manifest>

但是,我想知道你是否可以以类似的方式发送和接收彩信。 在做了一些研究之后,博客上提供的许多示例只是将You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order.传递给本机Messaging应用程序。 我试图在不离开我的申请的情况下发送彩信。 似乎没有标准的发送和接收MMS的方式。 有没有人得到这个工作?

此外,我知道SMS / MMS ContentProvider不是官方Android SDK的一部分,但我认为有人可能已经能够实现这一点。 任何帮助是极大的赞赏。

更新

我在getMMSApns()文件中添加了You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order.以接收彩信

<receiver android:name="com.sendit.receivers.MMSReceiver" >
    <intent-filter>
        <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />

        <data android:mimeType="application/vnd.wap.mms-message" />
    </intent-filter>
</receiver>

在MMSReceiver类中,You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order.方法只能获取发送消息的phoneNumber。 你如何从MMS中获取其他重要信息,例如媒体附件(图像/音频/视频)的文件路径或MMS中的文本?

MMSReceiver.java

public class MMSReceiver extends BroadcastReceiver {
    private final String DEBUG_TAG = getClass().getSimpleName().toString();
    private static final String ACTION_MMS_RECEIVED = "android.provider.Telephony.WAP_PUSH_RECEIVED";
    private static final String MMS_DATA_TYPE = "application/vnd.wap.mms-message";

     // Retrieve MMS
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();
        String type = intent.getType();

        if(action.equals(ACTION_MMS_RECEIVED) && type.equals(MMS_DATA_TYPE)){

            Bundle bundle = intent.getExtras();

            Log.d(DEBUG_TAG, "bundle " + bundle);
            SmsMessage[] msgs = null;
            String str = "";
            int contactId = -1;
            String address;

            if (bundle != null) {

                byte[] buffer = bundle.getByteArray("data");
                Log.d(DEBUG_TAG, "buffer " + buffer);
                String incomingNumber = new String(buffer);
                int indx = incomingNumber.indexOf("/TYPE");
                if(indx>0 && (indx-15)>0){
                    int newIndx = indx - 15;
                    incomingNumber = incomingNumber.substring(newIndx, indx);
                    indx = incomingNumber.indexOf("+");
                    if(indx>0){
                        incomingNumber = incomingNumber.substring(indx);
                        Log.d(DEBUG_TAG, "Mobile Number: " + incomingNumber);
                    }
                }

                int transactionId = bundle.getInt("transactionId");
                Log.d(DEBUG_TAG, "transactionId " + transactionId);

                int pduType = bundle.getInt("pduType");
                Log.d(DEBUG_TAG, "pduType " + pduType);

                byte[] buffer2 = bundle.getByteArray("header");      
                String header = new String(buffer2);
                Log.d(DEBUG_TAG, "header " + header);

                if(contactId != -1){
                    showNotification(contactId, str);
                }

                // ---send a broadcast intent to update the MMS received in the
                // activity---
                Intent broadcastIntent = new Intent();
                broadcastIntent.setAction("MMS_RECEIVED_ACTION");
                broadcastIntent.putExtra("mms", str);
                context.sendBroadcast(broadcastIntent);

            }
        }

    }

    /**
    * The notification is the icon and associated expanded entry in the status
    * bar.
    */
    protected void showNotification(int contactId, String message) {
        //Display notification...
    }
}

根据android.provider.Telephony的文档:

广播操作:设备已收到新的基于文本的SMS消息。 意图将具有以下额外值:

You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order. - getMMSApns()APNHelpers,其中包含组成消息的PDU。

可以使用You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order.提取额外值   如果BroadcastReceiver在处理此意图时遇到错误,则应该适当地设置结果代码。

You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order.

广播操作:设备已收到新的基于数据的SMS消息。 意图将具有以下额外值:

You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order. - getMMSApns()APNHelpers,其中包含组成消息的PDU。

可以使用getMessagesFromIntent(android.content.Intent)提取额外值。   如果BroadcastReceiver在处理此意图时遇到错误,则应该适当地设置结果代码。

You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order.

广播操作:设备已收到新的WAP PUSH消息。 意图将具有以下额外值:

You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order. - WAP交易ID

You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order. - WAP PDU类型`

You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order. - 消息的标题

You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order. - 消息的数据有效负载

You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order. - 与内容类型关联的任何参数(从WSP Content-Type标头解码)

如果BroadcastReceiver在处理此意图时遇到错误,则应该适当地设置结果代码。   contentTypeParameters额外值是按名称键入的内容参数的映射。   如果遇到任何未分配的已知参数,则映射的键将为“unassigned / 0x ...”,其中“...”是未分配参数的十六进制值。 如果参数具有无值,则映射中的值将为null。

You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order.

更新#2

我已经想出如何通过You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order.传递额外内容以获得getMMSApns():Android PendingIntent附加功能,未被BroadcastReceiver接收

但是,额外的传递给SendBroadcastReceiver而不是SMSReceiver。 如何将额外的内容传递给SMSReceiver?

更新#3

接收彩信

所以在做了更多的研究之后,我看到了一些注册You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order.的建议。这样你就可以检测到getMMSApns()内容提供商有什么变化,从而允许你检测传入的彩信。 以下是我发现的最接近的示例:接收彩信

但是,有一个变量You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order.类型为getMMSApns().APNHelper类在哪里实现? 是否有注册ContentObserver的其他任何实现?

发送彩信

至于发送彩信,我遇到过这个例子:发送彩信

问题是我尝试在我的Nexus 4上运行此代码,这是在Android v4.2.2上,我收到此错误:

java.lang.SecurityException: No permission to write APN settings: Neither user 10099 nor current process has android.permission.WRITE_APN_SETTINGS.

APNHelper类的getMMSApns()方法中查询You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order. ContentProvider后,将引发错误。

final Cursor apnCursor = this.context.getContentResolver().query(Uri.withAppendedPath(Carriers.CONTENT_URI, "current"), null, null, null, null);

显然你无法在Android 4.2中阅读APN

对于使用移动数据执行操作(如发送MMS)并且不知道设备中存在默认APN设置的所有应用程序,有哪些替代方案?

更新#4

发送彩信

我试过这个例子:发送彩信

正如@Sam在他的回答中建议的那样:

You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order.

所以现在我不再收到SecurityException错误。 我正在测试Android KitKat上的Nexus 5。 运行示例代码后,它会在调用后给出200响应代码

MMResponse mmResponse = sender.send(out, isProxySet, MMSProxy, MMSPort);

但是,我检查过我尝试发送彩信的人。 他们说他们从未收到彩信。

trans by 2019-06-01T08:58:24Z

service - Android - 从广播接收器onReceive()获取上下文发送

我基本上想要创建一个intent并将它传递给我的BroadcastReceiver的onReceive()服务。

到目前为止,我总是使用View.getContext(),但在这里,我被卡住了。我怎么能得到上下文所以我可以使用public Intent (Context packageContext, Class<?> cls)

trans by 2019-05-20T08:34:57Z

api - 如何检查Receiver是否在Android中注册?

我需要检查我的注册接收者是否仍然注册,如果不是我如何检查任何方法?

trans by 2019-04-04T18:50:59Z

android - 如何使用LocalBroadcastManager?

如何使用/定位LocalBroadcastManager,如谷歌文档和服务广播文档中所述?

我试图谷歌它,但没有可用的代码开始?

文件说如果我想在我的应用程序进程内部进行广播,我应该使用它,但我不知道在哪里寻找这个。

任何帮助/评论?

更新:我知道如何使用广播,但不知道如何在我的项目中获得LocalBroadcastManager

trans by 2019-03-30T19:39:40Z

android - Servi中的广播接收器

我想在Service内启动BroadcastReceiver。我要做的是运行后台运行service,收集传入的短信,并记录来电。 我认为最好的方法是运行service,它包含一个可以编目的广播接收器。

我该怎么做呢? 我已经启动并运行了我的服务。

trans by 2019-03-30T07:48:43Z

1 2 下一页 共2页