2014-12-04 6 views
0

GCM을 통해 알림을 보내려고합니다. 테스트 프로젝트에서 제대로 작동합니다. 그러나 세부적인 디자인에서 나는 거의 변하지 않았다. 저는 액티비티를 조각으로 사용하지 않습니다. 그리고 내가 등록 번호를 얻으려고 할 때GCMRegistrar.getRegistrationId에서 빈 ID를 가져옵니다.

regId = GCMRegistrar.getRegistrationId(getActivity()); 

빈 REGId를 얻으십시오. 도움말은 문제가 무엇인지 양해 바랍니다

내 조각 :

package com.managment.pavel.managmentgradle.fragments; 

    .... 

    import static com.managment.pavel.managmentgradle.Services.CommonUtilities.DISPLAY_MESSAGE_ACTION; 
    import static com.managment.pavel.managmentgradle.Services.CommonUtilities.EXTRA_MESSAGE; 
    import static com.managment.pavel.managmentgradle.Services.CommonUtilities.SENDER_ID; 
    import static com.managment.pavel.managmentgradle.Services.CommonUtilities.SERVER_URL; 
    import static com.managment.pavel.managmentgradle.Services.CommonUtilities.TAG; 

    import com.google.android.gcm.GCMRegistrar; 
    import com.managment.pavel.managmentgradle.R; 
    import com.managment.pavel.managmentgradle.Services.ServerUtilities; 

    public class NotifyFragment extends Fragment implements View.OnClickListener { 

     private final BroadcastReceiver mHandleMessageReceiver = 
       new BroadcastReceiver() { 
        @Override 
        public void onReceive(Context context, Intent intent) { 
         String newMessage = intent.getExtras().getString(EXTRA_MESSAGE); 
         mDisplay.setText(newMessage + "\n"); 
        } 
       }; 

     private TextView mDisplay; 
     private AsyncTask<Void, Void, Void> mRegisterTask; 
     private String regId; 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      View v = inflater.inflate(R.layout.notify_fragment, null); 

      ... 

      GCMRegistrar.checkDevice(getActivity()); 
      GCMRegistrar.checkManifest(getActivity()); 

      getActivity().registerReceiver(mHandleMessageReceiver, new IntentFilter(DISPLAY_MESSAGE_ACTION)); 
      mDisplay = (TextView) v.findViewById(R.id.notyfi_status); 

      return v; 
     } 

     @Override 
     public void onClick(View v) { 
      switch (v.getId()){ 
       case R.id.regGCM: 
        regId = GCMRegistrar.getRegistrationId(getActivity()); 
        Log.d(TAG,"regId"+regId); 
        if (regId.equals("")) { 
         GCMRegistrar.register(getActivity(), SENDER_ID); 
        } else {...} 
        break; 
        case R.id.unregGCM: 
        GCMRegistrar.unregister(getActivity()); 
        break; 
      } 
     } 
    } 

내 매니페스트 :

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.managment.pavel.managmentgradle" > 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <permission 
     android:name="com.managment.pavel.managmentgradle.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 
    <uses-permission 
     android:name="com.managment.pavel.managmentgradle.permission.C2D_MESSAGE" /> 
    <!-- This app has permission to register and receive data message. --> 
    <uses-permission 
     android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.managment.pavel.managmentgradle.MyActivity" 
      android:label="@string/app_name" 
      android:configChanges="orientation|keyboardHidden|keyboard|screenSize" android:theme="@style/Theme.AppCompat"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
      <!--<service android:name=".Services.GuestIn" android:process=":GuestIn"/>--> 
     </activity> 

     <receiver 
      android:name="com.google.android.gcm.GCMBroadcastReceiver" 
      android:permission="com.google.android.c2dm.permission.SEND" > 
      <intent-filter> 
       <!-- Receives the actual messages. --> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <!-- Receives the registration id. --> 
       <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
       <category android:name="com.managment.pavel.managmentgradle" /> 
      </intent-filter> 
     </receiver> 

     <service android:name=".Services.GCMIntentService" /> 

    </application> 

</manifest> 

Untilites :

public final class CommonUtilities { 

    public static final String SERVER_URL = "http://..........."; 
    public static final String SENDER_ID = "...................."; 
    public static final String TAG = "GCMDemo"; 
    public static final String DISPLAY_MESSAGE_ACTION ="DISPLAY_MESSAGE"; 
    public static final String EXTRA_MESSAGE = "message"; 

    static void displayMessage(Context context, String message) { 
     Intent intent = new Intent(DISPLAY_MESSAGE_ACTION); 
     intent.putExtra(EXTRA_MESSAGE, message); 
     context.sendBroadcast(intent); 
    } 
} 

답변

0

GCMRegistrar.register 너무, GCM에 대한 비동기 등록을 트리거 전화 GCMRegistrar.getRegistrationId imm 이 메소드의 뒤에서는 빈 등록 ID가 반환 될 가능성이 높습니다. 또한 사용되지 않습니다.

대신 GoogleCloudMessaging.register 메서드를 사용해야합니다. 이는 Google Play 서비스의 일부이며 동기식이므로 등록 ID를 즉시 받게됩니다.

Google의 GCM Demo 코드를 참조 할 수 있습니다.

+0

링크를 이용해 주셔서 감사 드리겠습니다. 그러나 지금은 돌연변이에 대한 시간이 없습니다. 내 코드에서 바꿀 것을 제안 할 수도 있습니다. –

+0

그리고 나는 GCMRegistrar.register 후에 GCMRegistrar.getRegistrationId를 발생시키지 않습니다. 줄곧 –

관련 문제