Почему подписи нулевые?

Добрый день!
Я попробовал этот код:

PackageInfo info = mContext.getPackageManager().getPackageArchiveInfo(absolute_apk_name, PackageManager.GET_SIGNATURES);
        if (info != null)
        {
            Signature[] sig = info.signatures;
            if (sig != null)
                sigstring = new String(sig[0].toChars());
        }

Но info.signatures == null, и я понятия не имею "почему?"
Файл в absolute_apk_name существует, я проверил Android 2.1

ОБНОВЛЕНИЕ:

absolute_apk_name = "/data/data/ru.UseIT.SimpleFormsLauncher/files/SimpleFormsGeneral.apk"  

apk создан с флагами Context.MODE_WORLD_READABLE|Context.MODE_WORLD_WRITEABLE

Но если выполнить этот код

Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setDataAndType(Uri.fromFile(new File(absolute_apk_name )), "application/vnd.android.package-archive");
        mContext.startActivity(intent);

Он был установлен.


person andreich    schedule 19.03.2013    source источник
comment
@DrinkJavaCodeJava, я обновляю вопрос   -  person andreich    schedule 19.03.2013
comment
Попробуйте другие флаги и посмотрите, что произойдет.   -  person DrinkJavaCodeJava    schedule 19.03.2013
comment
@DrinkJavaCodeJava, какие еще флаги? ДОБАВИТЬ?   -  person andreich    schedule 19.03.2013
comment
Как насчет GET_PERMISSIONS. Я знаю, что все файлы имеют разрешения, поэтому попробуйте это.   -  person DrinkJavaCodeJava    schedule 19.03.2013
comment
@DrinkJavaCodeJava, можно посмотреть пример? Просто не понимаю   -  person andreich    schedule 19.03.2013
comment
@DrinkJavaCodeJava, и мой код работает в Android 4*   -  person andreich    schedule 19.03.2013
comment
Что вы пытаетесь достичь? Я не понимаю, почему вы проверяете, является ли массив sig нулевым.   -  person    schedule 26.05.2013
comment
Каково содержание вашего манифеста? У вас есть необходимые разрешения (для вашей версии Android)?   -  person andy256    schedule 11.07.2013
comment
Подписан ли APK для возврата каких-либо подписей?   -  person Alex Florescu    schedule 16.07.2013


Ответы (3)


Я проверил источник Android, и оказалось, что PackageManager#getPackageArchiveInfo(String, int) не включает подписи, если версия Android 2.3.7 и ниже.

Пожалуйста, смотрите ссылки ниже.

http://tools.oesf.biz/android-2.3.7_r1.0/xref/frameworks/base/core/java/android/content/pm/PackageManager.java#1891

http://tools.oesf.biz/android-4.0.3_r1.0/xref/frameworks/base/core/java/android/content/pm/PackageManager.java#2121

person bina    schedule 17.06.2014

это ошибка системы Android, см. это https://code.google.com/p/android/issues/detail?id=9151#c8 эта ошибка исправлена ​​в 4.0+

person yichouangle    schedule 06.01.2014

Я не совсем уверен, чего вы пытаетесь достичь, но использование абсолютного имени/пути apk неверно, вам нужно имя пакета. Мне удалось получить подписи, используя следующее: просто замените «com.android.chrome» на имя пакета нужного вам приложения.

final PackageInfo pkgInfo = packageManager.getPackageInfo(
                    "com.android.chrome", PackageManager.GET_SIGNATURES);
final Signature[] signatures = pkgInfo.signatures;
person scottyab    schedule 17.07.2013
comment
Пытаюсь получить подпись другого apk, не установленного - person andreich; 15.08.2013
comment
может быть, использовать openssl для получения сертификата? stackoverflow.com/questions/4324120/ - person scottyab; 15.08.2013
comment
Подождите, вы делаете это на устройстве? и пытаетесь проверить подпись apk перед установкой? - person scottyab; 15.08.2013
comment
Да, до установки :) - person andreich; 15.08.2013
comment
похоже, вы используете неправильный API. PackageManager предназначен для установленных приложений. - person josephus; 06.01.2014
comment
Это совсем не так. Как упоминалось выше, ранние версии Android просто не будут возвращать подписи. - person Sam Shute; 02.12.2014