运行Android TabHost时出错

运行Android TabHost时出错,android,android-emulator,android-widget,android-layout,android-tabhost,Android,Android Emulator,Android Widget,Android Layout,Android Tabhost,嘿,我正在尝试实现两个选项卡。每一个调用一个特定的活动。但当我尝试运行时,出现以下错误: 12-07 20:26:22.164: ERROR/AndroidRuntime(363): FATAL EXCEPTION: main 12-07 20:26:22.164: ERROR/AndroidRuntime(363): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.psyhclo/com.psyhcl

嘿,我正在尝试实现两个选项卡。每一个调用一个特定的活动。但当我尝试运行时,出现以下错误:

12-07 20:26:22.164: ERROR/AndroidRuntime(363): FATAL EXCEPTION: main
12-07 20:26:22.164: ERROR/AndroidRuntime(363): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.psyhclo/com.psyhclo.Main}: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.psyhclo/com.psyhclo.RatedCalls}: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.CallLogProvider from ProcessRecord{405a8ac8 363:com.psyhclo/10030} (pid=363, uid=10030) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.os.Looper.loop(Looper.java:123)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.app.ActivityThread.main(ActivityThread.java:3647)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at java.lang.reflect.Method.invokeNative(Native Method)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at java.lang.reflect.Method.invoke(Method.java:507)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at dalvik.system.NativeStart.main(Native Method)
12-07 20:26:22.164: ERROR/AndroidRuntime(363): Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.psyhclo/com.psyhclo.RatedCalls}: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.CallLogProvider from ProcessRecord{405a8ac8 363:com.psyhclo/10030} (pid=363, uid=10030) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.app.ActivityThread.startActivityNow(ActivityThread.java:1462)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:654)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.widget.TabHost.setCurrentTab(TabHost.java:326)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.widget.TabHost.addTab(TabHost.java:216)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at com.psyhclo.Main.onCreate(Main.java:17)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     ... 11 more
12-07 20:26:22.164: ERROR/AndroidRuntime(363): Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.CallLogProvider from ProcessRecord{405a8ac8 363:com.psyhclo/10030} (pid=363, uid=10030) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.os.Parcel.readException(Parcel.java:1322)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.os.Parcel.readException(Parcel.java:1276)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:1882)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.app.ActivityThread.getProvider(ActivityThread.java:3311)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.app.ActivityThread.acquireProvider(ActivityThread.java:3336)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.app.ContextImpl$ApplicationContentResolver.acquireProvider(ContextImpl.java:1634)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.content.ContentResolver.acquireProvider(ContentResolver.java:748)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.content.ContentResolver.query(ContentResolver.java:256)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at com.psyhclo.RatedCalls.onCreate(RatedCalls.java:27)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586)
12-07 20:26:22.164: ERROR/AndroidRuntime(363):     ... 20 more
这里是Main.java

import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TabHost;

public class Main extends TabActivity {

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    TabHost tabHost = getTabHost();
    tabHost.addTab(tabHost.newTabSpec("one").setIndicator("Rated Calls")
            .setContent(new Intent(this, RatedCalls.class)));
    tabHost.addTab(tabHost.newTabSpec("two").setIndicator("Rated Contacts")
            .setContent(new Intent(this, SMS.class)));

    tabHost.setCurrentTab(2);

}

    }
下面是RatedCalls.java类

import java.text.DateFormat;
import java.util.ArrayList;

import com.psyhclo.R;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

public class RatedCalls extends Activity {

private static TextView txtView;
private CallDataHelper dh;
StringBuilder sb = new StringBuilder();

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.ratedcalls);        

    //txtView = (TextView) findViewById(R.id.TextView01);
    TextView txtView = new TextView(this);
    Cursor cursor = getContentResolver().query(
            android.provider.CallLog.Calls.CONTENT_URI, null, null, null,
            android.provider.CallLog.Calls.DATE + " DESC ");

    startManagingCursor(cursor);
    int numberColumnId = cursor
            .getColumnIndex(android.provider.CallLog.Calls.NUMBER);
    int durationId = cursor
            .getColumnIndex(android.provider.CallLog.Calls.DURATION);
    int contactNameId = cursor
            .getColumnIndex(android.provider.CallLog.Calls.CACHED_NAME);
    int dateId = cursor.getColumnIndex(android.provider.CallLog.Calls.DATE);
    int numTypeId = cursor.getColumnIndex(android.provider.CallLog.Calls.CACHED_NUMBER_TYPE);

    ArrayList<String> callList = new ArrayList<String>();
    if (cursor.moveToFirst()) {
        do {

            String callerPhoneNumber = cursor.getString(numberColumnId);
            String contactName = cursor.getString(contactNameId);
            String duration = cursor.getString(durationId);
            String callDate = DateFormat.getDateInstance().format(dateId);      
            String numType = cursor.getString(numTypeId);

            //this.dh.insert(1, contactName, callerPhoneNumber, numType, duration, callDate, "01:20");
            Toast.makeText(getBaseContext(), "Inserted!", Toast.LENGTH_LONG);
            callList.add("\nNew Info: \nContact Number: "
                    + callerPhoneNumber + "\nContact Name: " + contactName
                    + "\nDuration: " + duration + "\nDate: " + callDate);

        } while (cursor.moveToNext());
    }
    txtView.setText(callList.toString());
}
    }
导入java.text.DateFormat;
导入java.util.ArrayList;
进口com.psyhclo.R;
导入android.app.Activity;
导入android.database.Cursor;
导入android.os.Bundle;
导入android.widget.TextView;
导入android.widget.Toast;
公共类RatedCalls扩展了活动{
私有静态文本视图txtView;
私人电话助理;;
StringBuilder sb=新的StringBuilder();
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.ratedcalls);
//txtView=(TextView)findViewById(R.id.TextView01);
TextView txtView=新的TextView(此);
Cursor Cursor=getContentResolver().query(
android.provider.CallLog.Calls.CONTENT_URI,null,null,null,
android.provider.CallLog.Calls.DATE+“DESC”);
开始管理游标(游标);
int numberColumnId=光标
.getColumnIndex(android.provider.CallLog.Calls.NUMBER);
int durationId=游标
.getColumnIndex(android.provider.CallLog.Calls.DURATION);
int contactNameId=游标
.getColumnIndex(android.provider.CallLog.Calls.CACHED_NAME);
int dateId=cursor.getColumnIndex(android.provider.CallLog.Calls.DATE);
int numTypeId=cursor.getColumnIndex(android.provider.CallLog.Calls.CACHED\u NUMBER\u TYPE);
ArrayList callList=新的ArrayList();
if(cursor.moveToFirst()){
做{
String callerPhoneNumber=cursor.getString(numberColumnId);
String contactName=cursor.getString(contactNameId);
String duration=cursor.getString(durationId);
字符串callDate=DateFormat.getDateInstance().format(日期ID);
String numType=cursor.getString(numTypeId);
//this.dh.insert(1,contactName,callerPhoneNumber,numType,duration,callDate,“01:20”);
Toast.makeText(getBaseContext(),“Inserted!”,Toast.LENGTH\u LONG);
呼叫列表。添加(“\n新信息:\n联系人号码:”
+callerPhoneNumber+“\n联系人姓名:”+contactName
+“\n持续时间:”+duration+“\n日期:”+callDate);
}while(cursor.moveToNext());
}
setText(callList.toString());
}
}
下面是ratedcalls.xml

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="5dp">
    <TabWidget
        android:id="@android:id/tabs"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp" />
</LinearLayout>
</TabHost>
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="5dp">
    <TabWidget
        android:id="@android:id/tabs"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp" />
</LinearLayout>
</TabHost>

下面是main.xml

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="5dp">
    <TabWidget
        android:id="@android:id/tabs"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp" />
</LinearLayout>
</TabHost>
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="5dp">
    <TabWidget
        android:id="@android:id/tabs"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp" />
</LinearLayout>
</TabHost>

日志清楚地说明了问题:

SecurityException: Permission Denial: opening provider
com.android.providers.contacts.CallLogProvider requires
android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS

检查清单文件中的权限。

根据stacktrace,问题实际上不在这些文件中。检查您的AndroidManifest.xml文件,并确保您具有访问联系人的适当权限。如果您仍然需要帮助,那么我建议您发布AndroidManifest.xml文件的源代码。这不是错误。我已经更改了它,并设置了正确的权限。我添加了:仍然是相同的堆栈跟踪?您是否在正确的位置添加了权限?权限位于清单标记中,而不是应用程序标记中。顺便说一句,与其添加答案,不如编辑您的问题并添加信息。我已经添加了manifest标记,但现在当我运行应用程序时,它说它已安装在emulator上,但图标没有显示在屏幕上。日志上没有错误很高兴能帮上忙!祝你的应用程序好运!