源码阅读
#!/bin/bash
echo "======start repo sync======"
repo sync
while [ $? == 1 ]; do
echo "======sync failed, re-sync again======"
sleep 3
repo sync
done
http://mirrors.ustc.edu.cn/aosp/platform/manifest.git/refs/heads/
- 读源码地址
http://androidxref.com/ - Android permission
https://android.googlesource.com/platform/frameworks/base/+/master/core/res/AndroidManifest.xml
关于contentprovider涉及到的权限
package com.ep.testprovider;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private String columns = ContactsContract.Contacts.DISPLAY_NAME;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.tv);
String name = getQueryData();
tv.setText(columns + "\n" + name);
}
private String getQueryData()
{
StringBuilder sb = new StringBuilder();
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
int DisplayNameIndex = cursor.getColumnIndex(columns);
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext())
{
sb.append(cursor.getString(DisplayNameIndex) + "\n");
}
return sb.toString();
}
}
- 多少app使用了
getContentResolver
和resolver.xxx(URI, ...)
- Axplorer中对使用了这些URI的API是否进行权限解析
Intent涉及到的权限
主要是BroadcastReceiver
https://www.jianshu.com/p/f348f6d7fe59
在 Android 系统中,广播(Broadcast)是在组件之间传播数据的一种机制,这些组件可以位于不同的进程中,起到进程间通信的作用
BroadcastReceiver 是对发送出来的 Broadcast 进行过滤、接受和响应的组件。首先将要发送的消息和用于过滤的信息(Action,Category)装入一个 Intent 对象,然后通过调用 Context.sendBroadcast() 、 sendOrderBroadcast() 方法把 Intent 对象以广播形式发送出去。 广播发送出去后,所以已注册的 BroadcastReceiver 会检查注册时的 IntentFilter 是否与发送的 Intent 相匹配,若匹配则会调用 BroadcastReceiver 的 onReceiver() 方法
所以当我们定义一个 BroadcastReceiver 的时候,都需要实现 onReceiver() 方法。BroadcastReceiver 的生命周期很短,在执行 onReceiver() 方法时才有效,一旦执行完毕,该Receiver 的生命周期就结束了
Android中的广播分为两种类型,标准广播和有序广播
- 标准广播
标准广播是一种完全异步执行的广播,在广播发出后所有的广播接收器会在同一时间接收到这条广播,之间没有先后顺序,效率比较高,且无法被截断 - 有序广播
有序广播是一种同步执行的广播,在广播发出后同一时刻只有一个广播接收器能够接收到, 优先级高的广播接收器会优先接收,当优先级高的广播接收器的 onReceiver() 方法运行结束后,广播才会继续传递,且前面的广播接收器可以选择截断广播,这样后面的广播接收器就无法接收到这条广播了
1:AndroidManifest.xml 注册广播
<!--打电话广播-->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<!--监听电话状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<receiver android:name=".service.PhoneBroadcastReceiver">
<intent-filter android:priority="1000">
//主动打电话时,发送的广播
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
//电话状态改变时,发送的广播 (振铃,挂断,接通)
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
2:onReceive
@Override
public void onReceive(Context context, Intent intent) {
log.info("收到电话广播:{}", intent == null ? "null" : intent.getAction());
// 如果是拨打电话
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
//拨打电话会优先,收到此广播. 再收到 android.intent.action.PHONE_STATE 的 TelephonyManager.CALL_STATE_OFFHOOK 状态广播;
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
log.info("call OUT:{}", phoneNumber);//获取拨打的手机号码
} else {
// 如果是来电
TelephonyManager tManager = (TelephonyManager) context
.getSystemService(Service.TELEPHONY_SERVICE);
//电话的状态
switch (tManager.getCallState()) {
case TelephonyManager.CALL_STATE_RINGING:
//等待接听状态
mIncomingNumber = intent.getStringExtra("incoming_number");
log.info("RINGING :" + mIncomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
//接听状态
break;
case TelephonyManager.CALL_STATE_IDLE:
//挂断状态
break;
}
}
}
网友评论