2017-10-31 3 views
1

내 Android 앱을 사용하는 사람이 Firebase Storage에 비디오를 업로드 할 때 활동이 삭제 된 경우에도 비디오를 업로드하고 싶습니다. 내가 asynctask를 사용하여 시도했지만 작동하지 않는 것 같습니다. 다음은 AsyncTask를 코드입니다 : 내가 활동이 파괴 될 때 AsyncTask를 여전히 실행한다는 많은 것을 읽었습니다Android Firebase 보관 활동이 파괴되면 업로드하기

public class UploadAttachment extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     userRef.child("currentSeason").addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       if (dataSnapshot.exists()) { 

        final String attachCurrentSeason = dataSnapshot.getValue().toString(); 

        seasonRef.child("id").addListenerForSingleValueEvent(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 

          String path = "users/" + mAuth.getUid() + "/" + attachCurrentSeason + "/game" + String.valueOf(Integer.parseInt(dataSnapshot.getValue().toString()) - 1); 
          StorageReference storageReference = storage.getReference(path); 

          storageReference.putBytes(byteArray); 

         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 

       } 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
     return null; 
    } 
} 

,하지만 나를 위해 작동하지 않습니다. asynctask에서 firebase를 사용할 수 있습니까?

도움을 주시면 감사하겠습니다. 미리 감사드립니다!

+0

귀하의 사이트에 (완료, 성공 또는 실패) 첨부 된 [모든 리스너] (https://developers.google.com/android/reference/com/google/android/gms/tasks/Task)가 없습니다. 'UploadTask'는'putBytes()'에 의해 반환됩니다. 업로드가 성공적으로 시작되었지만 완료되지 않았 음을 어떻게 알았습니까? –

+0

@BobSnyder firebase 저장소가 동영상을 파일로 표시하지 않기 때문에 작동하지 않는다는 것을 알고 있습니다. – MrAppMachine

+0

완료 및/또는 진행 수신기를 putBytes()에 추가하는 것이 좋습니다. 그러면 적어도 업로드 시작합니다. 보안 규칙 또는 기타 문제로 인해 즉시 실패 할 수 있습니다. –

답변

0

동영상이 너무 무거워서 배경 서비스를 사용하는 것이 좋습니다.이 서비스는 official Android documentation에서 정보를 찾을 수 있습니다.

당신은 이런 식으로 만들 수 있습니다 : 그것은 모든 데이터를 전달 서비스 시작, 당신의 활동에

public class UploadVideoService extends IntentService { 
    public UploadVideoService() { 
     super("UploadVideoService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent workIntent) { 
     String path = workIntent.getStringExtra("path"); 
     StorageReference storageReference = storage.getReference(path); 
     storageReference.putBytes(workIntent.getByteArrayExtra("data")); 
    } 
} 

(는 별도의 UploadVideoService.java 클래스를 정의하는 것이 더 좋습니다) :

//... 
userRef.child("currentSeason").addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     if (dataSnapshot.exists()) { 
      final String attachCurrentSeason = dataSnapshot.getValue().toString(); 
      seasonRef.child("id").addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        String path = "users/" + mAuth.getUid() + "/" + attachCurrentSeason + "/game" + String.valueOf(Integer.parseInt(dataSnapshot.getValue().toString()) - 1); 

        // here you call the service, replace Activity with your Activity name 
        Intent mServiceIntent = new Intent(Activity.this, UploadVideoService.class); 
        mServiceIntent.putExtra("path", path); 
        mServiceIntent.putExtra("data", byteArray); 
        startService(mServiceIntent); 

       } 
       @Override 
       public void onCancelled(DatabaseError databaseError) {} 
      }); 
     } 
    } 
    @Override 
    public void onCancelled(DatabaseError databaseError) {} 
}); 
//... 

또한 매니페스트에서 다음과 같이 서비스를 정의해야합니다.

<service android:name=".UploadVideoService" android:exported="false"/> 

업로드 후 작업이 완료되었다는 것을 사용자에게 알리기 위해 알림 표시 줄에 알림을 넣을 수 있습니다.

+0

고마워,하지만 바이트 배열이 지나치게 커야하고 내 비디오가 4MB 밖에되지 않는다고 말했어 – MrAppMachine

+0

비디오가 메모리에 저장되면 문자열로 서비스에 Uri를 전달할 수있다 –

+0

감사합니다.이 파일을 업로드 해 보았습니다. 내가 앱을 할 때,하지만 업로드하는 동안 앱에서 내릴 때 끝나지 않습니다. 또한, 사이드 노트 : 이것이 영향을 미치는지 확신 할 수는 없지만 의도 서비스를 시작한 직후 나는 활동을 변화시키고 있습니다. 그게 아무것도 영향을 미치지는 않을지 모르겠지만. 마지막으로 인 텐트 서비스는 앱이 파괴되었을 때만 시작할 수 있습니까? 응용 프로그램이 실행 중일 때부터 시작합니다. – MrAppMachine

관련 문제