【发布时间】:2019-07-29 09:21:04
【问题描述】:
我使用来自 youtube 的视频教程创建了一个发布密钥,不幸的是,我在部署之前创建的发布密钥没有 .扩大。当在谷歌云平台上检查以限制我的应用程序的密钥时,他们需要一个 .keystore 扩展名。但随后用于创建发布密钥的 android 教程具有 .jks 扩展名。扩展真的很重要,因为我的应用程序拒绝显示谷歌地图并且 facebook 登录也无法工作吗?下面是我的 android manifest 和模块应用程序
然而,我已经向 google play store 发送了一封邮件,要求更改我的发布密钥(使用带有 .jks 扩展名的 android 教程),但仍未收到回复。
以下是我查看的一些链接以寻求帮助
(教程) https://www.youtube.com/watch?v=AWawL5HFn64
Release APK file not showing google maps
https://developer.android.com/studio/publish/app-signing#generate-key
build.gradle(模块:app)
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
buildToolsVersion '28.0.3'
defaultConfig {
applicationId "com.readygo.showmoney"
minSdkVersion 16
targetSdkVersion 28
versionCode 7
versionName "1.0.5"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
packagingOptions {
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/DEPENDENCIES.txt'
exclude '.readme'
}
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false
}
sourceSets { main { assets.srcDirs = ['src/main/assets', 'src/main/res/avataruni'] } }
compileOptions {
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:2.0.0-beta2'
implementation 'com.google.android.gms:play-services-maps:17.0.0'
implementation 'com.android.support:support-v4:28.0.0'
testImplementation 'junit:junit:4.13-beta-3'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.android.support:cardview-v7:28.0.0'
implementation 'com.kaopiz:kprogresshud:1.1.0'
implementation 'com.wrapp.floatlabelededittext:library:0.0.6'
implementation 'com.makeramen:roundedimageview:2.3.0'
implementation 'com.github.fuzz-productions:RatingBar:1.0.3'
implementation 'com.android.support:design:28.0.0'
implementation 'com.github.florent37:singledateandtimepicker:2.0.4'
implementation 'com.github.dmytrodanylyk.shadow-layout:library:1.0.3'
implementation 'com.zcw:togglebutton-library:1.0.0'
implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'com.seatgeek:placesautocomplete:0.3-SNAPSHOT'
implementation 'com.google.android.gms:play-services-location:17.0.0'
//implementation 'com.google.android.gms:play-services-places:17.0.0'
implementation 'com.google.android.libraries.places:places:2.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
// Firebase
implementation 'com.google.android.gms:play-services-auth:17.0.0'
//facebook
implementation 'com.facebook.android:facebook-login:[5,6)'
// volley plus
// implementation 'dev.dworks.libs:volleyplus:0.1.4'
// retrofit
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.6.0'
// okhttp
implementation 'com.squareup.okhttp3:okhttp:4.0.1'
// gson
implementation 'com.google.code.gson:gson:2.8.5'
// permission manager
implementation 'com.karumi:dexter:5.0.0'
// date management
implementation 'net.danlew:android.joda:2.10.2'
//apache common util
implementation 'org.apache.commons:commons-collections4:4.4'
//smart-location-lib
implementation 'io.nlopez.smartlocation:library:3.3.3'
//dialog progress bar
implementation 'com.github.d-max:spots-dialog:1.1@aar'
//pushy
implementation 'me.pushy:sdk:1.0.43'
//multi dex
implementation 'com.android.support:multidex:1.0.3'
//string manipulation
implementation 'org.apache.commons:commons-lang3:3.9'
// exit interface
implementation "com.android.support:exifinterface:28.0.0"
//custom tabs
implementation "com.android.support:customtabs:28.0.0"
}
apply plugin: 'com.google.gms.google-services'
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.readygo.showmoney">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.location.gps" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application
android:name=".app.AppController"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".activities.Act_Shop_Billing"></activity>
<activity
android:name=".activities.ShopSearchActivity"
android:windowSoftInputMode="stateHidden" />
<activity android:name=".activities.Act_Main_Rating" />
<activity android:name=".activities.Create_Update_Holiday_Break" />
<activity android:name=".activities.CreateAppointment" />
<activity
android:name=".activities.Act_Splash"
android:screenOrientation="portrait"
android:theme="@style/FullScreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id"/>
<activity android:name="com.facebook.FacebookActivity"
android:configChanges=
"keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name" />
<activity
android:name="com.facebook.CustomTabActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="@string/fb_login_protocol_scheme" />
</intent-filter>
</activity>
<activity
android:name=".activities.Act_Login_Option"
android:screenOrientation="portrait" />
<activity
android:name=".activities.Act_Login"
android:screenOrientation="portrait" />
<activity
android:name=".activities.SendEmailActivity"
android:screenOrientation="portrait" />
<activity
android:name=".activities.Act_Reg_Customer"
android:screenOrientation="portrait" />
<activity
android:name=".activities.Act_Reg_Barbers"
android:screenOrientation="portrait" />
<activity
android:name=".activities.Act_Home_Cust"
android:screenOrientation="portrait" />
<!--
The API key for Google Maps-based APIs is defined as a string resource.
(See the file "res/values/google_maps_api.xml").
Note that the API key is linked to the encryption key used to sign the APK.
You need a different API key for each encryption key, including the release key that is used to
sign the APK for publishing.
You can define the keys for the debug and release targets in src/debug/ and src/release/.
-->
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_key" />
<activity
android:name=".activities.Act_Maps"
android:label="@string/title_activity_maps" />
<service
android:name=".service.GpsService"
android:enabled="true" />
<activity
android:name=".activities.SelectBookDateActivity"
android:screenOrientation="portrait" />
<activity
android:name=".activities.Act_Choose_Photo"
android:screenOrientation="portrait" />
<activity
android:name=".activities.OpeningHoursActivity"
android:screenOrientation="portrait" />
<activity
android:name=".activities.Act_DayTime_Choice"
android:screenOrientation="portrait" />
<activity
android:name=".activities.Act_Add_Service"
android:screenOrientation="portrait" />
<activity
android:name=".activities.Act_Add_Barber"
android:screenOrientation="portrait" />
<activity
android:name=".activities.Act_Home_Barber"
android:screenOrientation="portrait" />
<activity
android:name=".activities.Act_Upload_Profile_Picture"
android:screenOrientation="portrait" />
<activity android:name=".activities.Act_Barber_Shop_Services" />
<activity android:name=".activities.Act_BookingHistory_BarberShop" />
<activity android:name=".activities.UpcomingBarberShopBookingActivity" /> <!-- Pushy Declarations -->
<!-- Pushy Notification Receiver -->
<!-- Incoming push notifications will invoke the following BroadcastReceiver -->
<receiver
android:name=".activities.PushReceiver"
android:exported="false">
<intent-filter>
<!-- Do not modify this -->
<action android:name="pushy.me" />
</intent-filter>
</receiver> <!-- Pushy Update Receiver -->
<!-- Do not modify - internal BroadcastReceiver that restarts the listener service -->
<receiver
android:name="me.pushy.sdk.receivers.PushyUpdateReceiver"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>
</receiver> <!-- Pushy Boot Receiver -->
<!-- Do not modify - internal BroadcastReceiver that restarts the listener service -->
<receiver
android:name="me.pushy.sdk.receivers.PushyBootReceiver"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver> <!-- Pushy Socket Service -->
<!-- Do not modify - internal service -->
<service android:name="me.pushy.sdk.services.PushySocketService" /> <!-- Pushy Job Service (added in Pushy SDK 1.0.35) -->
<!-- Do not modify - internal service -->
<service
android:name="me.pushy.sdk.services.PushyJobService"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" />
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
</application>
</manifest>
对于谷歌地图,它显示一个完全空白的屏幕,没有任何标记或地图显示。
Facebook 登录显示消息“登录错误:登录此应用程序时出错。请稍后再试”尽管出现错误消息,我也能够获取哈希键并将其直接添加到 facebook 开发人员网站,它仍然无法正常工作。
【问题讨论】:
-
你上传到Play商店了吗?
.扩展名没什么大不了的 -
是的,我将它上传到了 Play 商店,这时我注意到地图显示为空白,并且 Facebook 登录向我显示了错误消息。但它在调试模式下完美运行,因为我使用调试密钥库将 SHA 添加到谷歌控制台并将哈希键添加到 facebook。 @Hanzala
-
检查我的答案