80,348
社区成员
发帖
与我相关
我的任务
分享
package com.test;
import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.CallLog;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
Button btnGetMissed = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnGetMissed = (Button) findViewById(R.id.btnMissedCall);
btnGetMissed.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final String[] projection = null;
final String selection = null;
final String[] selectionArgs = null;
final String sortOrder = android.provider.CallLog.Calls.DATE + " DESC";
Cursor cursor = null;
try {
cursor = getContentResolver().query(
Uri.parse("content://call_log/calls"), projection,
selection, selectionArgs, sortOrder);
while (cursor.moveToNext()) {
String callLogID = cursor.getString(cursor
.getColumnIndex(android.provider.CallLog.Calls._ID));
String callNumber = cursor.getString(cursor
.getColumnIndex(android.provider.CallLog.Calls.NUMBER));
String callDate = cursor.getString(cursor
.getColumnIndex(android.provider.CallLog.Calls.DATE));
String callType = cursor.getString(cursor
.getColumnIndex(android.provider.CallLog.Calls.TYPE));
String isCallNew = cursor.getString(cursor
.getColumnIndex(android.provider.CallLog.Calls.NEW));
if (Integer.parseInt(callType) == (CallLog.Calls.MISSED_TYPE)
&& Integer.parseInt(isCallNew) > 0) {
Toast.makeText(getApplication(),
"Missed Call Found: " + callNumber,
Toast.LENGTH_SHORT).show();
}
}
} catch (Exception e) {
e.printStackTrace();
}
finally {
cursor.close();
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
cursor = getContentResolver().query(
Uri.parse("content://call_log/calls"), projection,
selection, selectionArgs, sortOrder);
然后真机测试的时候还是会直接强退if(cursor != null && cursor.moveToFirst())
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
啊,问题解决了、、谢谢大神~
12-06 14:13:40.861: E/AndroidRuntime(3008): FATAL EXCEPTION: main
12-06 14:13:40.861: E/AndroidRuntime(3008): java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.CallLogProvider from ProcessRecord{42333630
3008:com.example.ringhelper/u0a52} (pid=3008, uid=10052) requires android.permission.READ_CALL_LOG or android.permission.WRITE_CALL_LOG
12-06 14:13:40.861: E/AndroidRuntime(3008): at android.os.Parcel.readException(Parcel.java:1425)
12-06 14:13:40.861: E/AndroidRuntime(3008): at android.os.Parcel.readException(Parcel.java:1379)
12-06 14:13:40.861: E/AndroidRuntime(3008): at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2389)
12-06 14:13:40.861: E/AndroidRuntime(3008): at android.app.ActivityThread.acquireProvider(ActivityThread.java:4392)
12-06 14:13:40.861: E/AndroidRuntime(3008): at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:1759)
12-06 14:13:40.861: E/AndroidRuntime(3008): at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1123)
12-06 14:13:40.861: E/AndroidRuntime(3008): at android.content.ContentResolver.query(ContentResolver.java:355)
12-06 14:13:40.861: E/AndroidRuntime(3008): at android.content.ContentResolver.query(ContentResolver.java:314)
12-06 14:13:40.861: E/AndroidRuntime(3008): at com.example.ringhelper.MainActivity$1.onClick(MainActivity.java:23)
12-06 14:13:40.861: E/AndroidRuntime(3008): at android.view.View.performClick(View.java:4091)
12-06 14:13:40.861: E/AndroidRuntime(3008): at android.view.View$PerformClick.run(View.java:17072)
12-06 14:13:40.861: E/AndroidRuntime(3008): at android.os.Handler.handleCallback(Handler.java:615)
12-06 14:13:40.861: E/AndroidRuntime(3008): at android.os.Handler.dispatchMessage(Handler.java:92)
12-06 14:13:40.861: E/AndroidRuntime(3008): at android.os.Looper.loop(Looper.java:153)
12-06 14:13:40.861: E/AndroidRuntime(3008): at android.app.ActivityThread.main(ActivityThread.java:5000)
12-06 14:13:40.861: E/AndroidRuntime(3008): at java.lang.reflect.Method.invokeNative(Native Method)
12-06 14:13:40.861: E/AndroidRuntime(3008): at java.lang.reflect.Method.invoke(Method.java:511)
12-06 14:13:40.861: E/AndroidRuntime(3008): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
12-06 14:13:40.861: E/AndroidRuntime(3008): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
12-06 14:13:40.861: E/AndroidRuntime(3008): at dalvik.system.NativeStart.main(Native Method)
看log的意思好像是没给权限?查看通信记录的权限我查了下应该是这个:
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
Manifest里面写了啊= =
cursor = getContentResolver().query(
Uri.parse("content://call_log/calls"), projection,
selection, selectionArgs, sortOrder);
然后真机测试的时候还是会直接强退[/quote]
强退你把log贴出来看看