2017-02-15 11 views
1

Я создал Android-мобильный Android с Xamarin Android. В этом приложении есть функция, которая может отправить изображение в твиттер. Я тестировал эту функцию после загрузки приложения из магазина воспроизведения на Samsung S7, alcatel Pixi4 и моего планшета (Galaxy Tab 2). Мой код создает файл растрового изображения во внешнем кэшированном хранилище и запрашивает твиттер для чтения этого файла, чтобы привязать его к твиту.Почему я не могу читать мои файлы в каталоге внешнего кэша?

Он отлично работает. Тем не менее, я попросил других проверить его (они также загрузили мое приложение из магазина воспроизведения), и они сказали мне, что файл создан в каталоге кеша, но растровое изображение не привязано к их твитам. Важно также знать, что другие приложения, которые делают, что (например, долгое твит) работают на всех устройствах:

https://play.google.com/store/apps/details?id=de.cbruegg.longtweet

Я не понимаю. Twitter, работает на всех устройствах. Это проверено. Приложения (например, длинные твиты) могут отправить файл в твиттер, чтобы чирикать это. Это также работает на всех устройствах. Кроме того, мое приложение прекрасно записывает файлы в каталог кеша. Работает на всех устройствах. Кроме того, мое приложение может отправить растровое изображение в твиттер, чтобы чирикать изображение. Это работает на моем S7. Но не на S7 моего тестера. Я не понимаю. Вот мой код. В некотором роде я делаю что-то неправильно. Кстати, генерация твитов всегда работает. Это просто случай, когда изображение не прикрепляется к твиту при тестировании на устройстве моего тестера.

Вот мой код. Пожалуйста, дайте мне знать, как я должен это улучшить.

public bool TweetImage(Bitmap imageToTweet) 
{ 
    var messageIntent = context.FindMessageIntent(this.twitterConstants.PackageName); 
    if (messageIntent == null) 
    { 
     return false; 
    } 
    string outputFileBMP = SaveBitmap(imageToTweet); 
    context.Tweet(messageIntent, outputFileBMP, this.twitterConstants.DefaultTwitterText, this.twitterConstants.ChooserMessage); 
    return true; 
} 

private string SaveBitmap(Bitmap imageToTweet) 
{ 
    string outputFileBMP = System.IO.Path.Combine(context.ExternalCacheDir.Path, System.Guid.NewGuid().ToString() + ".bmp"); 
    using (var outputFileStream = System.IO.File.Create(outputFileBMP)) 
    { 
     imageToTweet.Compress(Android.Graphics.Bitmap.CompressFormat.Png, 100, outputFileStream); 
    } 
    return outputFileBMP; 
} 

и

public static Intent FindMessageIntent(this ContextWrapper contextWrapper, params string[] packageNames) 
{ 
    Intent wantedIntent = new Intent(); 
    wantedIntent.SetType("text/plain"); 

    var resolveInfos = contextWrapper.PackageManager.QueryIntentActivities(wantedIntent, PackageInfoFlags.MatchDefaultOnly); 

    var result = (from r in resolveInfos 
        from p in packageNames 
        where p == r.ActivityInfo.PackageName 
        select p).FirstOrDefault(); 

    if (result != null) 
    { 
     wantedIntent.SetPackage(result); 
     return wantedIntent; 
    } 
    return null; 
} 

и

public static void Tweet(this ContextWrapper contextWrapper, Intent messageIntent, string filePath = null, string message = null, string chooserMessage = null) 
{ 
    if (filePath != null) 
    { 
     using (var file = new Java.IO.File(filePath)) 
     { 
      messageIntent.PutExtra(Intent.ExtraStream, Android.Net.Uri.FromFile(file)); 
     } 
    } 
    if (message != null) 
    { 
     messageIntent.PutExtra(Intent.ExtraText, message); 
    } 

    if (chooserMessage != null) 
    { 
     using (var chooser = Intent.CreateChooser(messageIntent, chooserMessage)) 
     { 
      contextWrapper.StartActivity(chooser); 
     } 
     return; 
    } 
    contextWrapper.StartActivity(messageIntent); 
} 

ответ

1

Поскольку вы используете внешний каталог кэша, вы всегда должны убедиться, что она существует, прежде чем использовать его. Из Android документации:

Внешнее хранилище может быть недоступно, например, когда пользователь смонтировал хранения на ПК или удалил карту памяти SD, которая обеспечивает внешний накопитель, вы всегда должны убедиться, что объем доступный до его доступа. Вы можете запросить внешнее состояние хранилища, вызвав getExternalStorageState(). Если возвращаемое состояние равно MEDIA_MOUNTED, вы можете читать и записывать свои файлы.

S7 поддерживает карты MicroSD, так что, возможно, это так с вашим тестером?

Кроме того, Long Tweet делает изображение, хранящее и разделяющее несколько иначе, чем вы. Вот отличия:

  1. Они хранят сгенерированное растровое изображение во внутреннем каталоге кеша (CacheDir вместо ExternalCacheDir).
  2. Они устанавливают разрешения чтения и записи (свойства Readable и Executable объекта File) в результирующий файл и каталог, чтобы другие приложения могли получить доступ к файлу, когда у них есть полный путь.

Для записи, вот код Java для того, как они настраивают намерение:

public static void intentImage(Context context, File file, String intentAction) 
{ 
    file.getParentFile().getParentFile().setExecutable(true, false); 
    file.getParentFile().setExecutable(true, false); 
    file.getParentFile().getParentFile().setReadable(true, false); 
    file.getParentFile().setReadable(true, false); 
    file.setReadable(true, false); 
    file.setExecutable(true, false); 

    String fileStr = "file://" + file.toString(); 

    Intent intent = new Intent(); 
    intent.setAction(intentAction); 

    if (intentAction == "android.intent.action.SEND") 
    { 
     intent.putExtra("android.intent.extra.STREAM", Uri.parse(fileStr)); 
     intent.setType("image/" + fileStr.substring(fileStr.lastIndexOf(".") + 1)); 
    } 

    else 
    { 
     intent.setDataAndType(Uri.parse(fileStr), "image/" + fileStr.substring(fileStr.lastIndexOf(".") + 1)); 
    } 

    context.startActivity(intent); 
} 

Я хотел бы начать с использованием внутреннего каталога кэша и установив необходимые разрешения на файл сгенерированного (возможно также родительская папка).

 Смежные вопросы

  • Нет связанных вопросов^_^