ANDROID - Fragment - 从Parse后端下载文件,将其保存在外部存储中,然后创建Application Chooser

时间:2015-12-09 18:51:58

标签: java android android-fragments android-studio parse-platform

我正在开发一个项目,该项目使用Parse.com作为后端来共享文件。 它可以成功共享图像和视频,并可以打开它们。因此,我不需要从云端下载它们 我收到了很多关于文件的问题,但是我终于能够分享它们几个月了。

现在,我仍然需要你的帮助。

在我的收件箱片段中,我列出了所有已发送的文件。 但是,我希望将它们保存到外部存储空间,并且可以将用户发送到应用选择器,以便在单击时打开文件 (更重要的是将其保存在外部存储器中。)

我知道,可以使用简单的方法。但是,这里的问题是,它是一个片段,我在点击监听器上。 因此,显然,我正面临错误,因为我不知道如何在片段中使用它。

这是我的 InboxFragment .java

public class InboxFragment extends ListFragment {

protected List<ParseObject> mMessages;

public static final String TAG = MainActivity.class.getSimpleName();

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_inbox, container, false);

    return rootView;
}

@Override
public void onResume() {
    super.onResume();

    getActivity().setProgressBarIndeterminateVisibility(true);

    ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(ParseConstants.CLASS_MESSAGES);
    query.whereEqualTo(ParseConstants.KEY_RECIPIENT_IDS, ParseUser.getCurrentUser().getObjectId());
    query.addDescendingOrder(ParseConstants.KEY_CREATED_AT);
    query.findInBackground(new FindCallback<ParseObject>() {
        @Override
        public void done(List<ParseObject> messages, ParseException e) {
            getActivity().setProgressBarIndeterminateVisibility(false);

            if (e == null) {
                // We found messages!
                mMessages = messages;

                String[] usernames = new String[mMessages.size()];
                int i = 0;
                for (ParseObject message : mMessages) {
                    usernames[i] = message.getString(ParseConstants.KEY_SENDER_NAME);
                    i++;
                }
                if (getListView().getAdapter() == null) {
                    MessageAdapter adapter = new MessageAdapter(
                            getListView().getContext(),
                            mMessages);
                    setListAdapter(adapter);
                } else {
                    // refill the adapter!
                    ((MessageAdapter) getListView().getAdapter()).refill(mMessages);
                }
            }
        }
    });
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    ParseObject message = mMessages.get(position);
    String messageType = message.getString(ParseConstants.KEY_FILE_TYPE);
    ParseFile file = message.getParseFile(ParseConstants.KEY_FILE);
    Uri fileUri = Uri.parse(file.getUrl());

    if (messageType.equals(ParseConstants.TYPE_IMAGE)) {
        // view the image
        Intent intent = new Intent(getActivity(), ViewImageActivity.class);
        intent.setData(fileUri);
        startActivity(intent);
    } else {
        if (messageType.equals(ParseConstants.TYPE_VIDEO)) {
            // view the video
            Intent intent = new Intent(Intent.ACTION_VIEW, fileUri);
            intent.setDataAndType(fileUri, "video/*");
            startActivity(intent);
        } else {

            ParseFile docFile = (ParseFile) message.get("file");
            docFile.getDataInBackground(new GetDataCallback() {
                public void done(byte[] data, ParseException e) {
                    if (e == null) {
                        // data has the bytes for the file
                        //Intent intent = new Intent(getActivity(), SaveFileActivity.class);
                        //startActivity(intent);

                        //save the file on external storage
                        public File getAlbumStorageDir(String fileName) {
                            // Get the directory for the user's public downloads directory.
                            File file = new File(Environment.getExternalStoragePublicDirectory(
                                    Environment.DIRECTORY_DOWNLOADS), fileName);
                            if (!file.mkdirs()) {
                                Log.e(LOG_TAG, "Directory not created");
                            }
                            return file;
                        }

                        PackageManager packageManager = getPackageManager();
                        List activities = packageManager.queryIntentActivities(intent,
                                PackageManager.MATCH_DEFAULT_ONLY);
                        boolean isIntentSafe = activities.size() > 0;

                        Intent intent = new Intent(Intent.ACTION_SEND);
                        ...

                        // Always use string resources for UI text.
                        // This says something like "Share this photo with"
                        String title = getResources().getString(R.string.chooser_title);
                        // Create intent to show chooser
                        Intent chooser = Intent.createChooser(intent, title);

                        // Verify the intent will resolve to at least one activity
                        if (intent.resolveActivity(getPackageManager()) != null) {
                            startActivity(chooser);
                        }

                    }

                    else {
                            // something went wrong
                            Toast.makeText(getActivity(), "An Error Occured.", Toast.LENGTH_SHORT).show();

                        }
                    }
                });
            }
        }
    }
}

在这里,我把应该在Activity中的代码放在一个片段中,还是可以在这里执行相同的操作?或者,我必须为此创建一个新的SaveFileActivity?

这是我的InboxFragment的快照:
http://i.imgur.com/F9tiTll.png?1

这是创建文件并将其发送到Parse Cloud的 RecipientsActivity.java

public class RecipientsActivity extends ListActivity {

public static final String TAG = RecipientsActivity.class.getSimpleName();

protected ParseRelation<ParseUser> mContactsRelation;
protected ParseUser mCurrentUser;
protected List<ParseUser> mContacts;
protected Uri mMediaUri;
protected String mFileType;

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

    getActionBar().setDisplayHomeAsUpEnabled(true);

    getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

    mMediaUri = getIntent().getData();
    mFileType = getIntent().getExtras().getString(ParseConstants.KEY_FILE_TYPE);
}

@Override
public void onResume() {
    super.onResume();

    mCurrentUser = ParseUser.getCurrentUser();
    mContactsRelation = mCurrentUser.getRelation(ParseConstants.KEY_CONTACTS_RELATION);

    // Add Progress bar here on

    ParseQuery<ParseUser> query = mContactsRelation.getQuery();
    query.addAscendingOrder(ParseConstants.KEY_USERNAME);
    query.findInBackground(new FindCallback<ParseUser>() {
        @Override
        public void done(List<ParseUser> contacts, ParseException e) {
            // Add Progress bar off

            if (e == null) {
                mContacts = contacts;

                String[] usernames = new String[mContacts.size()];
                int i = 0;
                for (ParseUser user : mContacts) {
                    usernames[i] = user.getUsername();
                    i++;
                }
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                        getListView().getContext(),
                        android.R.layout.simple_list_item_multiple_choice,
                        usernames);
                setListAdapter(adapter);
            } else {
                Log.e(TAG, e.getMessage());
                AlertDialog.Builder builder = new AlertDialog.Builder(RecipientsActivity.this);
                builder.setMessage(e.getMessage())
                        .setTitle(R.string.error_title)
                        .setPositiveButton(android.R.string.ok, null);
                AlertDialog dialog = builder.create();
                dialog.show();
            }
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_recipients, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            // This ID represents the Home or Up button. In the case of this
            // activity, the Up button is shown. Use NavUtils to allow users
            // to navigate up one level in the application structure. For
            // more details, see the Navigation pattern on Android Design:
            //
            // http://developer.android.com/design/patterns/navigation.html#up-vs-back
            //
            NavUtils.navigateUpFromSameTask(this);
            return true;
        case R.id.action_send:
            ParseObject message = createMessage();
            if (message == null) {
                // error
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setMessage(R.string.error_selecting_file)
                        .setTitle(R.string.error_selecting_file_title)
                        .setPositiveButton(android.R.string.ok, null);
                AlertDialog dialog = builder.create();
                dialog.show();
            }
            else {
                send(message);
                finish();
            }
            return true;
    }
    return super.onOptionsItemSelected(item);
}

protected ParseObject createMessage() {
    ParseObject message = new ParseObject(ParseConstants.CLASS_MESSAGES);
    message.put(ParseConstants.KEY_SENDER_ID, ParseUser.getCurrentUser().getObjectId());
    message.put(ParseConstants.KEY_SENDER_NAME, ParseUser.getCurrentUser().getUsername());
    message.put(ParseConstants.KEY_RECIPIENT_IDS, getRecipientIds());
    message.put(ParseConstants.KEY_FILE_TYPE, mFileType);

    byte[] fileBytes = FileHelper.getByteArrayFromFile(this, mMediaUri);

    if (fileBytes == null) {
        return null;
    }
    else {
        if (mFileType.equals(ParseConstants.TYPE_IMAGE)) {
            fileBytes = FileHelper.reduceImageForUpload(fileBytes);
            String fileName = FileHelper.getFileName(this, mMediaUri, mFileType);
            ParseFile file = new ParseFile(fileName, fileBytes);
            message.put(ParseConstants.KEY_FILE, file);
        }
        else if (mFileType.equals(ParseConstants.TYPE_VIDEO)){
            String fileName = FileHelper.getFileName(this, mMediaUri, mFileType);
            ParseFile file = new ParseFile(fileName, fileBytes);
            message.put(ParseConstants.KEY_FILE, file);
        }
        else{
            String fileName = FileHelper.getFileName(this, mMediaUri, mFileType);
            ParseFile file = new ParseFile(fileName, fileBytes);
            message.put(ParseConstants.KEY_FILE, file);
        }

        return message;
    }
}

protected ArrayList<String> getRecipientIds() {
    ArrayList<String> recipientIds = new ArrayList<String>();
    for (int i = 0; i < getListView().getCount(); i++) {
        if (getListView().isItemChecked(i)) {
            recipientIds.add(mContacts.get(i).getObjectId());
        }
    }
    return recipientIds;
}

protected void send(ParseObject message) {
    message.saveInBackground(new SaveCallback() {
        @Override
        public void done(ParseException e) {
            if (e == null) {
                // success!
                Toast.makeText(RecipientsActivity.this, R.string.success_message, Toast.LENGTH_LONG).show();
            }
            else {
                AlertDialog.Builder builder = new AlertDialog.Builder(RecipientsActivity.this);
                builder.setMessage(R.string.error_sending_message)
                        .setTitle(R.string.error_selecting_file_title)
                        .setPositiveButton(android.R.string.ok, null);




    AlertDialog dialog = builder.create();
                            dialog.show();
                      }
               }
          });      
     }
}

以下是来自 MainActivity.java

的代码
protected DialogInterface.OnClickListener mDialogListenerSendFile =
   new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
             // Choose File
                Intent chooseFileIntent = new Intent(Intent.ACTION_GET_CONTENT);
                chooseFileIntent.setType("*/*");
                chooseFileIntent.addCategory(Intent.CATEGORY_OPENABLE);

                Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),""));
                chooseFileIntent.putExtra(Intent.EXTRA_STREAM,uri);

                startActivityForResult(chooseFileIntent, PICK_DOCUMENT_REQUEST);
    }
};

让我再次澄清我的问题, 我在选择文件。 (在MainActivity中) 然后,我正在编写使用Parse发送文件(在RecipientsActivity中) 3.User收到文件(在InboxFragment中) 而且,在这里,我想要执行所需的操作。即(在收件箱片段中)On Click Listener应将文件直接保存到外部存储器中。应该打开一个app选择器打开该文件(下载后)   [它将在片段中完成]
[在InboxFragment中,请注意,通过OnClickListner,我已编码检索图像和视频并打开它们,但我不需要将它们下载。我想保存一个具有应用程序格式的文件,例如文档文件或联系人文件等。]

请帮助。
感谢。

0 个答案:

没有答案