如何在没有权限的android 6中使用广播接收器启动应用程序

Posted

技术标签:

【中文标题】如何在没有权限的android 6中使用广播接收器启动应用程序【英文标题】:How to Start app using Broadcast Receiver in android 6 which doesn't have permission 【发布时间】:2017-04-03 17:54:33 【问题描述】:

当电话打到我的手机时如何启动我的应用程序。广播接收器将无法工作,因为我的应用程序没有更早运行并且我没有权限在 android 6.0(Marshmallow) 中检查 android.permission.READ_PHONE_STATE。

我没有任何活动课程。我只是想在来电时创建一个txt文件。

我只是想知道当应用程序尚未启动时我们如何获得广播接收器的权限。来电时广播将无法正常工作,因为我们没有权限。

这是我的代码:

Android 清单

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

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <receiver
            android:name=".IncommingCallReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

IncommingCallReceiver.java

 package com.example.ranveer.teaser;

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.telephony.TelephonyManager;
    import java.io.*;
    import android.widget.Toast;
    public class IncommingCallReceiver extends BroadcastReceiver 
    
        public IncommingCallReceiver() 
        
        
        Context mContext;

        @Override
        public void onReceive(Context mContext, Intent intent)
        
            try
             File file = new File("Hello1.txt");
             file.createNewFile();
              FileWriter writer = new FileWriter(file);

        // Writes the content to the file
        writer.write("This\n is\n an\n example\n");
        writer.flush();
        writer.close();
            Toast.makeText(mContext,"Done writing in file",
                    Toast.LENGTH_SHORT).show();
         catch (Exception e) 
            Toast.makeText(mContext, e.getMessage(),
                    Toast.LENGTH_SHORT).show();
        

            try
            

                String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);



                if(state.equals(TelephonyManager.EXTRA_STATE_RINGING))
                
                    Toast.makeText(mContext, "Phone Is Ringing", Toast.LENGTH_LONG).show();
                    // Your Code
                

                if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK))
                
                    Toast.makeText(mContext, "Call Recieved", Toast.LENGTH_LONG).show();
                    // Your Code
                

                if (state.equals(TelephonyManager.EXTRA_STATE_IDLE))
                

                    Toast.makeText(mContext, "Phone Is Idle", Toast.LENGTH_LONG).show();
                    // Your Code

                
            
            catch(Exception e)
            
                //your custom message
            

        
    

【问题讨论】:

您需要一个Activity。就是这样。 【参考方案1】:

除非您的应用是系统应用,否则您需要至少有一个Activity,并且用户需要至少一次显式(手动)启动您的应用。否则,您的应用程序将保持“停止状态”,并且您的 BroadcastReceiver 将不会收到对 onReceive() 的任何调用。从 Android 3.0 开始就是这种情况。

【讨论】:

以上是关于如何在没有权限的android 6中使用广播接收器启动应用程序的主要内容,如果未能解决你的问题,请参考以下文章

用户在Android应用中停用位置权限时的广播接收器?

具有权限级别签名的Android广播接收器不接收广播

Android 广播 - 使用权限发送和接收

是否可以在运行时为广播接收器设置android权限级别?

Android本地广播的使用

Android广播阻塞、延迟问题