【问题标题】:Extended Calendar View - Content provider permission denied requires signature扩展日历视图 - 内容提供者权限被拒绝需要签名
【发布时间】:2023-03-24 03:44:01
【问题描述】:

我正在尝试显示一个 android 应用程序的每日视图。我决定使用库ExtendedCalendarView,但我无法让它运行。

我在做什么?

首先,我从 github 下载了库并导入到我的工作区。然后,我将 de 库导入到我的项目中。它似乎很好地导入(带有绿色勾号)。

在我的 MainActivity.java 中我什么也没做:

public class MainActivity extends Activity {

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

}

在我的设计 XML 文件中,我有显示 xml 的代码。 (和github里的一样):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >

<com.tyczj.extendedcalendarview.ExtendedCalendarView 
    android:id="@+id/calendar"
    android:layout_height="match_parent"
    android:layout_width="match_parent"/>

</RelativeLayout>

最后,在 AndroidManifest.xml 中,我将 ContentProvider 声明到标签中:

<provider
        android:name="com.tyczj.extendedcalendarview.CalendarProvider"
        android:authorities="com.tyczj.extendedcalendarview.cAlEndarprovider" />

发生了什么?

编译错误时,APP崩溃,日志中出现此错误信息:

致命异常:AsyncTask #1 java.lang.RuntimeException:在 java.util.concurrent.FutureTask$Sync 的 android.os.AsyncTask$3.done(AsyncTask.java:299) 处执行 doInBackground() 时发生错误。 innerSetException(FutureTask.java:273) at java.util.concurrent.FutureTask.setException(FutureTask.java:124) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) at java.util.concurrent .FutureTask.run(FutureTask.java:137) 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 在 java.util .concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 在 java.lang.Thread.run(Thread.java:856)

原因:java.lang.SecurityException: Permission Denial: 从 ProcessRecord{42dc32a8 8394:com.jcasadella.testcalendar/u0a145} (pid=8394, uid=10145) 打开提供程序 com.tyczj.extendedcalendarview.CalendarProvider 需要签名或在 android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2561) 在 android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2561) 在 android.os.Parcel.readException(Parcel.java:1379) 在 android.os.Parcel.readException(Parcel.java:1425) 签名.ActivityThread.acquireProvider(ActivityThread.java:4347) 在 android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1129) 在 android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:1836) 在 android.content.ContentResolver。 com.tyczj.extendedcalendarview.Day 的 android.content.ContentResolver.query(ContentResolver.java:336) 的查询(ContentResolver.java:378)$GetEvents.doInBackground(Day.java:122) com.tyczj.extendedcalendarview.Day $GetEvents.doInBackgro und(Day.java:1) at android.os.AsyncTask$2.call(AsyncTask.java:287) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

我的研究是什么?

我搜索了很多页面 (stackoverflow) 和其他页面,但找不到任何人出现此错误。

这似乎是我忘记了一些许可。目前我从未使用过 ContentProvider,也许问题就在这里......

我在 android 开发者官方页面中阅读了documentation,现在我对为什么该库使用 ContentProvider 感到有点困惑。

我还访问了 github 中的问题页面以搜索一些解决方案,但运气不好。

问题

我的问题是:

1) 不使用 ContentProvider 可以使用这个库吗?将事件保存在 sqlite 或内存中...如果可以,请指出正确的方向。

2) 我之前写的错误是什么原因?有人可以指出一个可能的解决方案吗?

新闻(2014 年 12 月 6 日)

我在其他设备上测试了相同的应用程序,它可以工作!我不知道发生了什么:

三星 Galaxy S3 (Android 4.3) -> 完美运行

Samsung Tab 3 (tablet Android 4.1) -> 权限拒绝错误。

这个APP需要在安卓4.1到4.3之间的平板tab3上运行。 现在,我将在库 github 页面中打开并发布。如果我有更多结果,我会在此处以答案格式发布。

提前致谢!感谢您每天在 stackoverflow 中的辛勤工作。

(对不起我的英语)

【问题讨论】:

  • android:authorities="com.tyczj.extendedcalendarview.cAlEndarprovider - 有错字吗?
  • 输入错误?可能是处理区分大小写的操作系统版本之一

标签: android eclipse permissions calendar android-library


【解决方案1】:

您可以编写自己的提供程序 - 像这样

(脏代码 - 但应该可以)

CalendarProviderLocal.java

public class CalendarProviderLocal  {

    private static final String DATABASE_NAME = "Calendar";
    private static final String EVENTS_TABLE = "events";
    private static final int DATABASE_VERSION = 4;

    public static final String EVENT = "event";
    public static final String LOCATION = "location";
    public static final String DESCRIPTION = "description";
    public static final String START = "start";
    public static final String END = "end";
    public static final String ID = "_id";
    public static final String START_DAY = "start_day";
    public static final String END_DAY = "end_day";
    public static final String COLOR = "color";

//  private static final HashMap<String, String> mMap;
    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    private Context ctx;


    public CalendarProviderLocal(Context ctx){
        this.ctx = ctx;
        DBHelper = new DatabaseHelper(ctx);
        db = DBHelper.getWritableDatabase();
    }

    private static class DatabaseHelper extends SQLiteOpenHelper{
        DatabaseHelper(Context context) 
        {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) 
        {
            createTables(db);
        }


        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, 
                              int newVersion) 
        {
            Log.w("CalendarProvider", "Upgrading database from version " + oldVersion 
                  + " to "
                  + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS events");
            onCreate(db);
        }

        private void createTables(SQLiteDatabase db){
            db.execSQL("CREATE TABLE " + EVENTS_TABLE + "(" + ID + " integer primary key autoincrement, " +
                    EVENT + " TEXT, " + LOCATION + " TEXT, " + DESCRIPTION + " TEXT, "
                    + START + " INTEGER, "+ END + " INTEGER, " + START_DAY + " INTEGER, " + END_DAY + " INTEGER, " + COLOR +" INTEGER);");
        }
    }


    public void deleteEvent(Event event) {
        db.delete(EVENTS_TABLE, ID + " = ?",
                new String[] { String.valueOf(event.getEventId()) });

    }


    public long insert(ContentValues values) {
        long rowID = db.insert(EVENTS_TABLE,null, values);
        return rowID;
    }


    public void resetTable() {
        // Delete All Rows
        db.delete(EVENTS_TABLE, null, null);

    }

}

并像这样使用它

ContentValues values = new ContentValues();
values.put(CalendarProvider.COLOR, Event.COLOR_PURPLE);
//.. bla bla
// Uri uri = getContentResolver().insert(CalendarProvider.CONTENT_URI, values);
long rowID = calendarProviderLocal.insert(values);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多